Refresh Rotate란
Reissue 엔드포인트에서 Refresh 토큰을 받아 Access 토큰 갱신 시 Refresh 토큰도 함께 갱신하는 방법이다.
- 장점
- Refresh 토큰 교체로 보안성 강화
- 로그인 지속시간 길어짐
- 추가 구현 작업
- 발급했던 Refresh 토큰을 모두 기억한 뒤, Rotate 이전의 Refresh 토큰은 사용하지 못하도록 해야 함.
Reissue
기존 ReissueController 코드에서 일부 로직만 추가하면 된다.
- PostMapping("/reissue") 경로 메소드
@PostMapping("/reissue")
public ResponseEntity<?> reissue(HttpServletRequest request, HttpServletResponse response) {
//get refresh token
String refresh = null;
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
if (cookie.getName().equals("refresh")) {
refresh = cookie.getValue();
}
}
if (refresh == null) {
//response status code
return new ResponseEntity<>("refresh token null", HttpStatus.BAD_REQUEST);
}
//expired check
try {
jwtUtil.isExpired(refresh);
} catch (ExpiredJwtException e) {
//response status code
return new ResponseEntity<>("refresh token expired", HttpStatus.BAD_REQUEST);
}
// 토큰이 refresh인지 확인 (발급시 페이로드에 명시)
String category = jwtUtil.getCategory(refresh);
if (!category.equals("refresh")) {
//response status code
return new ResponseEntity<>("invalid refresh token", HttpStatus.BAD_REQUEST);
}
String username = jwtUtil.getUsername(refresh);
String role = jwtUtil.getRole(refresh);
//make new JWT
String newAccess = jwtUtil.createJwt("access", username, role, 600000L);
String newRefresh = jwtUtil.createJwt("refresh", username, role, 86400000L);
//response
response.setHeader("access", newAccess);
response.addCookie(createCookie("refresh", newRefresh));
return new ResponseEntity<>(HttpStatus.OK);
}
- 쿠키 생성 메소드
private Cookie createCookie(String key, String value) {
Cookie cookie = new Cookie(key, value);
cookie.setMaxAge(24*60*60);
//cookie.setSecure(true);
//cookie.setPath("/");
cookie.setHttpOnly(true);
return cookie;
}
주의 점
Rotate 되기 이전의 토큰을 가지고 서버 측으로 가도 인증이 되기 때문에 서버 측에서 발급했던 Refresh 들을 기억한 뒤 블랙리스트 처리를 진행하는 로직을 작성해야 한다.
'Spring > Spring Security - JWT' 카테고리의 다른 글
스프링 JWT 심화 9 : 로그아웃 (0) | 2024.12.22 |
---|---|
스프링 JWT 심화 8 : Refresh 토큰 서버 측 저장 (0) | 2024.12.22 |
스프링 JWT 심화 6 : Refresh로 Access 토큰 재발급 (0) | 2024.12.22 |
스프링 JWT 심화 5 : Access 토큰 필터 : JWTFilter (0) | 2024.12.22 |
스프링 JWT 심화 4 : 다중 토큰 발급 (Refresh) (0) | 2024.12.22 |