📘JWT 사용하여 로그인 기능 구현
JWT 초기 세팅
1. 이메일, 비밀번호 요청 받음
2. 이메일로 DB 확인 후 암호화된 비밀번호 확인
3. Access Token, Refresh Token 발급
4. Refresh Token DB 저장 및 쿠키 저장
5. Access Token 은 Body로 반환 및 헤더 저장
Refresh Token 은 쿠키와 DB 모두 저장한다.Access Token 재발급 시 요청하는 Refresh Token 을 검증하는 DB 와 함께 검증하도록 하였다.public interface LoginRepository extends JpaRepository<User, Long> {
Optional<User> findByEmail(String email);
}
User Entity 를 사용하는 JPA Repository 생성//로그인
public TokenResponseDto login(LoginRequestDto requestDto) {
// User 정보
User user = loginRepository.findByEmail(requestDto.getEmail())
.orElseThrow(()->new ResponseStatusException(HttpStatus.NOT_FOUND));
// 암호화된 비밀번호 생성
passwordManager.validatePasswordMatchOrThrow(requestDto.getPassword(), user.getPassword());
return tokenService.createAndSaveTokens(user);
}
// 로그인 시 토큰 생성 및 저장
public TokenResponseDto createAndSaveTokens(User user) {
//토큰 생성
String accessToken = jwtTokenProvider.createAccessToken(user.getId());
String refreshToken = jwtTokenProvider.createRefreshToken(user.getId());
//refresh 토큰 DB 저장
tokenRepository.save(new Token(user, refreshToken));
return new TokenResponseDto(accessToken, refreshToken);
}
//토큰 유지 시간 (1시간)
private final long tokenValidityInMilliseconds = 1000 * 60 * 60;
//Access Token : 로그인 후 API 호출에 사용
public String createAccessToken(Long userId) {
return jwtTokenUtils.createToken(userId, tokenValidityInMilliseconds/4); // 15분
}
//Refresh Token : Access Token 이 만료됐을 때 재발급 요청에 사용
public String createRefreshToken(Long userId) {
return jwtTokenUtils.createToken(userId, tokenValidityInMilliseconds * 168); // 일주일
}
PasswordEncoder 사용하여 인코딩/디코딩 하였다.User Id (PK) 만 넣어줬다.Access Token : 15분Refresh Token : 일주일@PostMapping("/login")
public ResponseEntity<AccessTokenResponseDto> login(
@Valid @RequestBody LoginRequestDto requestDto,
HttpServletResponse response){
//비밀번호 확인 후 토큰 변환 후 반환
TokenResponseDto token = authService.login(requestDto);
// refresh 토큰을 쿠키에 추가
tokenCookieUtils.addRefreshTokenToCookie(token.getRefreshToken(), response);
return new ResponseEntity<>(new AccessTokenResponseDto(token.getAccessToken()),HttpStatus.OK);
}
//refresh token 쿠키 저장
public void addRefreshTokenToCookie(String refreshToken, HttpServletResponse response){
ResponseCookie cookie = ResponseCookie.from("refresh_token", refreshToken)
.httpOnly(true)
.secure(true)
.path("/")
.maxAge(Duration.ofDays(7))
.sameSite("Strict")
.build();
response.setHeader("Set-Cookie", cookie.toString());
}
Refresh Token 은 쿠키에 넣어준다.Access Token 은 바디에 넣어준다.요청 값
{
"email": "test@email.com",
"password": "1Q2w3e4r!"
}
반환 값 (Post Man)

Access Token 은 바디. Refresh Token 은 쿠키에 저장