JWT를 액세스/리프래시 토큰을 만들어보자 -(2) 기능을 구현하자

Alex·2025년 3월 2일
0

Plaything

목록 보기
116/118

우선 현재 액세스 토큰 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);

  }

이렇게 리프래시 토큰의 유효기간이 지났는지, 토큰이 제대로된 형태인지, 그리고 캐시서버에 리프래시 토큰이 담겨 있는지 유효성 체크를 계속 해준다.

만약에 유효성 검사를 통과한다면, 리프래시토큰으로 액세스 토큰을 다시 만들어준다.

profile
답을 찾기 위해서 노력하는 사람

0개의 댓글