미니 프로젝트 - JWT 로그인 구현

Zyoon·2025년 5월 30일

미니프로젝트

목록 보기
15/36
post-thumbnail

📘JWT 사용하여 로그인 기능 구현


JWT 초기 세팅

📗JWT (JSON Web Token) 초기 세팅


로그인 기능 흐름

1. 이메일, 비밀번호 요청 받음

2. 이메일로 DB 확인 후 암호화된 비밀번호 확인

3. Access Token, Refresh Token 발급

4. Refresh Token DB 저장 및 쿠키 저장

5. Access TokenBody로 반환 및 헤더 저장
  • Refresh Token 은 쿠키와 DB 모두 저장한다.
  • Access Token 재발급 시 요청하는 Refresh Token 을 검증하는 DB 와 함께 검증하도록 하였다.

Repository

public interface LoginRepository extends JpaRepository<User, Long> {
    Optional<User> findByEmail(String email);
}
  • User Entity 를 사용하는 JPA Repository 생성

Service

//로그인
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 사용하여 인코딩/디코딩 하였다.
  • Token 안에는 User Id (PK) 만 넣어줬다.
  • Refresh Token 은 DB에 저장해준다.
  • Access Token : 15분
  • Refresh Token : 일주일

Controller

@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 은 쿠키에 저장
profile
기어 올라가는 백엔드 개발

0개의 댓글