짧은 프로젝트

Springboot jwt 로그인5(엑세스 토큰 재발급)

디비드킴 2024. 1. 14. 18:11

1.재발급 로직 작성

public ResponseEntity<?> refreshAccessToken(HttpServletRequest request,HttpServletResponse response) {
    log.info("토큰재발급 로직 시작");
    String refreshToken = extractTokenFromCookie(request,"refresh_token");
    Map<String, Object> refreshTokenInfo = new HashMap<>();
    try {
        refreshTokenInfo = getRefreshTokenInfo(refreshToken);
        if (refreshTokenInfo == null) {
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("리프레시 토큰을 찾을 수 없거나 만료되었습니다. 다시 로그인하세요.");
        }
    }catch (Exception e){
        e.printStackTrace();
        log.error("refresh 토큰 추출중 에러발생");
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("리프레시 토큰을 찾을 수 없거나 만료되었습니다. 다시 로그인하세요.");
    }


    // 리프레시 토큰 정보에서 사용자 ID 추출
    String username = (String) refreshTokenInfo.get("id");

    // 새로운 엑세스 토큰 생성
    String newAccessToken = generateToken(username, TokenAbout.jwtExpirationInMs);
    // 리프레시 토큰 정보 업데이트
    saveRefreshToken(username, refreshToken, LocalDateTime.now(), Long.parseLong(refreshTokenInfo.get("issueCount").toString())+1);
    // 레디스에 저장된 리프레시 토큰 정보 확인
    logRefreshInfo(refreshToken,username);
    // 새로운 엑세스 토큰 쿠키 생성
    setAccessTokenAtCookie(newAccessToken,response);
    return ResponseEntity.ok().body(null);
}

2. 부가코드 작성

public String extractTokenFromCookie(HttpServletRequest request,String cookieName) {
    Cookie[] cookies = request.getCookies();
    if (cookies != null) {
        for (Cookie cookie : cookies) {
            if (cookieName.equals(cookie.getName())) {
                return cookie.getValue();
            }
        }
    }
    return null;
}
public void setAccessTokenAtCookie(String jwtToken,HttpServletResponse response){
    ResponseCookie jwtCookie = ResponseCookie.from("access_token", jwtToken)
            .path("/")
            .httpOnly(true)
            .maxAge(TokenAbout.jwtExpirationInMs * 60)
            .sameSite("none")
            .secure(true)
            .build();
    response.addHeader("Set-Cookie", jwtCookie.toString());
}
public void setCookie(HttpServletResponse response,String jwtToken,String refreshToken){
    setAccessTokenAtCookie(jwtToken,response);
    ResponseCookie refreshCookie = ResponseCookie.from("refresh_token", refreshToken)
            .path("/")
            .httpOnly(true)
            .maxAge(TokenAbout.refreshExpirationInMs*60)
            .sameSite("none")
            .secure(true)
            .build();
    response.addHeader("Set-Cookie", refreshCookie.toString());
}
public void logRefreshInfo(String refreshToken,String username){
    // 레디스에 저장된 리프레시 토큰 정보 확인
    Map<String,Object> savedTokenInfo = getRefreshTokenInfo(refreshToken);
    if (savedTokenInfo != null) {
        // 레디스에 저장된 리프레시 토큰 정보가 있는 경우 로그 출력
        log.info("Refresh Token Info from Redis: {}", savedTokenInfo);
    } else {
        // 레디스에 저장된 리프레시 토큰 정보가 없는 경우 로그 출력
        log.info("Refresh Token Info not found in Redis for user: {}", username);
    }
}

 

테스트

엑세스토큰만료
리프레시토큰 요청후
로그

소스

https://github.com/novb1492/login/tree/token-re

 

GitHub - novb1492/login

Contribute to novb1492/login development by creating an account on GitHub.

github.com