우선 현재 액세스 토큰 1개만 만들어놓은 상황이었으니
refresh 토큰까지 같이 발급하는 로직으로 변경해주자.
보통은 리프래시 토큰을
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;
}
이렇게 쿠키로 만들어서 전송하는것으로 보인다.
다만 모바일 앱에서는 XSS에 대한 위험이 덜한것으로 보여서 헤더로 보낸다.
우선, 이 리프래시 토큰을 헤더에 넣을지 바디에 넣을지 고민하게 됐다.
Rfc6749 specification를 보면 Oauth2를 할 때 리프래시 토큰을 아래처럼 바디에 넣어서 보내는 것으로 보인다.
우선, 기본적으로 처음에 위처럼 액세스 토큰과 리프래시 토큰을 만들어서 보낸다.
public String reissueAccessToken(RefreshTokenRequest request) {
try {
jwtProvider.isExpired(request.refreshToken());
} catch (ExpiredJwtException e) {
throw new CustomException(ErrorCode.REFRESH_TOKEN_IS_EXPIRED);
}
String category = jwtProvider.getCategory(request.refreshToken());
if (!category.equals("리프래시")) {
throw new CustomException(ErrorCode.NOT_REFRESH_TOKEN);
}
if (!redisTemplate.hasKey("리프래시토큰 키" + request.refreshToken())) {
throw new CustomException(ErrorCode.INVALID_REFRESH_TOKEN);
}
String user = jwtProvider.getUsername(request.refreshToken());
String role = jwtProvider.getRole(request.refreshToken());
return jwtProvider.createToken("access", user, role, 600000L);
}
이렇게 리프래시 토큰의 유효기간이 지났는지, 토큰이 제대로된 형태인지, 그리고 캐시서버에 리프래시 토큰이 담겨 있는지 유효성 체크를 계속 해준다.
만약에 유효성 검사를 통과한다면, 리프래시토큰으로 액세스 토큰을 다시 만들어준다.