오늘 학습한 내용
- 최종 프로젝트 (리프레시 토큰 적용, 로그아웃 기능)
작성한 코드는 다음과 같다.
/**
* 1. 전달받은 유저의 아이디로 유저가 존재하는지 확인
* 2. RefreshToken이 유효한지 체크
* 3. AccessToken을 발급한 뒤 쿠키에 추가
*/
@Override
@Transactional
public TokenResponseDto requestRefreshToken(HttpServletResponse res, HttpServletRequest req) {
String req2 = jwtUtil.getTokenFromRequest(req);
log.info(req2);
RefreshToken refreshToken = refreshTokenRepository.findByAccessToken(req2).orElseThrow(() -> new IllegalArgumentException("Token not found"));
String validateToken = jwtUtil.substringToken(refreshToken.getTokenValue());
if (!jwtUtil.validateRefreshToken(validateToken)) {
throw new IllegalArgumentException("로그인을 새로 해주세요.");
};
// 현재 쿠키 삭제
jwtUtil.deleteCookie(jwtUtil.getTokenFromRequest(req), res);
Claims claims = jwtUtil.getUserInfoFromRefreshToken(validateToken);
String token = jwtUtil.createAccessToken(claims.getSubject(), (RoleEnum) claims.get("AUTHORIZATION_KEY"));
refreshToken.update(token);
jwtUtil.addJwtToCookie(token, res);
return new TokenResponseDto(refreshToken.getTokenValue(), token);
}
처음에는 @AuthenticationPrincipal 을 사용해서 user의 정보를 가져왔는데 생각해보니 만료가 된 상태에서는 정보를 가져올 수 없었다.
또한 필터에서 계속 만료된 토큰이 걸려서 이를 해결하기 위해 우선 만료가 된 상황이면
req.getRequestDispatcher("/api/user/refresh-token").forward(req, res);
이렇게 컨트롤러를 호출하도록 했다.
사실 내가 작성한 코드가 맞는지는 잘 모르겠지만.. 우선 토큰이 잘 발급되고, 우선 기능이 돌아가니까 다른 기능을 더 우선적으로 구현하고 점점 수정해야겠다.
'TIL&WIL' 카테고리의 다른 글
| 2023-08-23 TIL (0) | 2023.08.23 |
|---|---|
| 2023-08-22 TIL (0) | 2023.08.22 |
| 2023-08-17 TIL (0) | 2023.08.17 |
| 2023-08-14 TIL (심화 프로젝트 KPT 회고) (0) | 2023.08.14 |
| 2023-08-09 TIL (0) | 2023.08.09 |