비밀번호 찾기는 사용자가 비밀번호를 분실했을 때,

자신의 아이디와 이메일을 입력하게되면 사용자가 입력한 아이디와 이메일을 통해 가입여부를 확인 후 가입 여부가 확인이 되면 해당 이메일로 비밀번호 변경 페이지로 연결되는 url을 전송합니다.

Untitled

비밀번호를 변경하기 위해서는 해당 사용자의 정보가 하나라도 있어야 그 정보를 통해 User Entity에 접근할 수 있었습니다.

하지만 해당 메일의 경우 html형식으로 보내다보니 react로 값을 넘기기가 쉽지 않았습니다.

그래서 초기에는 해당 url에 이전에 입력한 아이디를 붙여 전달했는데 이 경우 url에 있는 아이디만 다른 아이디로 수정하면 수정된 아이디의 사용자 비밀번호가 수정된다는 문제점이 있었습니다.

그래서 url에 붙이는 것이 아닌 쿠키에 저장해 넘길 수 있도록 했습니다.

하지만 이 경우도 쿠키의 변조가 쉬워 그대로 아이디를 저장할 수 없었습니다.

위와 같은 문제점으로 인해 최종적으로 채택한 방법은 아이디를 JWT로 변환해 해당 토큰을 쿠키에 저장하는 것입니다.

먼저, 사용자가 아이디와 이메일을 입력하면 가입정보를 확인 후 가입한 회원이 맞으면

토큰을 생성해 줍니다. 그 후 토큰을 쿠키에 저장합니다.

UserController

String token = userService.checkLoginIdAndEmail(findPasswordDTO);
if(!token.equals("")) {
    Cookie cookie = new Cookie("loginIdToken", token);
    cookie.setPath("/");
    cookie.setHttpOnly(true);
    cookie.setSecure(true);

    response.addCookie(cookie);

UserServiceImpl

int userCnt = userJPARepository.countByLoginIdAndEmail(findPasswordDTO.getLoginId(), findPasswordDTO.getEmail());
if(userCnt == 1){
		// 토큰 생성 후 해당 토큰 리턴
    return tokenProvider.generateLoinIdToken(findPasswordDTO.getLoginId(), Duration.ofMinutes(5));
}else{
    return "";
}

토큰은 loginId를 claim에 저장해 만들어집니다.