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
'짧은 프로젝트' 카테고리의 다른 글
Springboot jwt 로그인3(redis 리프레시토큰) (0) | 2024.01.12 |
---|---|
Springboot Jwt 로그인2(로그인 처리 후 쿠키 발급) (0) | 2024.01.12 |
Spring boot jwt 로그인 하기1 (기본세팅) (0) | 2024.01.11 |
Springboot 배달 시스템 만들기 3(위치정보 전송 및 표시하기 카카오지도) (0) | 2024.01.10 |
Springboot 배달 시스템 만들기 2(배달방 생성,삭제,메세지전송) (0) | 2024.01.10 |