ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 6월 16일 금요일 TIL 회고록
    카테고리 없음 2023. 6. 16. 22:41

    리프레시 토큰을 만들기 위해 먼저 유튜브를 참고하며 토큰 공부를 했다.

    https://www.youtube.com/watch?v=9eKIYjcPXp4 

    https://www.youtube.com/watch?v=TlWzEr4cXfc 

    두개를 봤다.

     

    먼저 로그인을 하면 액세스 토큰과 리프레시 토큰이 나오도록 코드를 수정했다.

     

    UserController.class

      // 로그인
      @PostMapping("/login")
      public TokenResponse login(@RequestBody LoginRequest loginRequest, HttpServletResponse response) {
        TokenResponse tokenResponse = userService.login(loginRequest);
        response.addHeader(JwtUtil.AUTHORIZATION_HEADER, tokenResponse.getAccessToken());
        return tokenResponse;
      }

    리턴 타입을 TokenResponse 클래스 타입으로 선언했다.

    TokenResponse 클래스에는 String accessToken, String refreshToken을 선언했다.

     

    TokenResponse.class

    @Getter
    @RequiredArgsConstructor
    public class TokenResponse {
    
      private final String accessToken;
      private final String refreshToken;
    
    }

     

    UserServiceImpl.class

    // 로그인
      @Override
      @Transactional
      public TokenResponse login(LoginRequest loginRequest) {
        User user = userRepository.findByLoginId(loginRequest.getLoginId()).orElseThrow(
            () -> new IllegalArgumentException("없는 계정입니다.")
        );
        if (!passwordEncoder.matches(loginRequest.getPassword(), user.getPassword())) {
          throw new IllegalStateException("아이디와 비밀번호를 확인해주시기 바랍니다.");
        }
    
        // jwtUtil.createAccessToken을 사용해 액세스 토큰을 생성한다.
        String accessToken = jwtUtil.createAccessToken(loginRequest.getLoginId(), user.getUserRole());
    
        // jwtUtil.createRefreshToken을 사용해 리프레시 토큰을 생성한다.
        String refreshToken = jwtUtil.createRefreshToken(loginRequest.getLoginId(), user.getUserRole());
    
        // RefreshToken을 Redis에 저장한다.
        saveRefreshTokenFromRedis(loginRequest.getLoginId(), refreshToken.substring(7));
        return new TokenResponse(accessToken, refreshToken);
      }

     

    jwtUtil.createAccessToken(loginRequest.getLoginId(), user.getUserRole())을 사용하여 accessToken, refreshToken을 만들었다.

    액세스 토큰, 리프레시 토큰을 만든 후 saveRefreshTokenFromRedis 메서드를 사용해 리프레시 토큰을 레디스에 저장한다.

    그 후 액세스 토큰과 리프레시 토큰을 리턴시켰다.

     

     

    saveRefreshTokenFromRedis

    // 레디스에 리프레시 토큰을 저장한다.
      // loginId와 refreshToken을 매개변수로 받고 redisDao.setValues를 사용하여 레디스에 저장한다.
      // 키는 loginId, 밸류는 refreshToken, 만료 시간은 Duration.ofMillis을 사용하여 JwtUtil에 선언된 리프레시 토큰 시간만큼 저장된다.
      private void saveRefreshTokenFromRedis(String loginId, String refreshToken) {
        redisDao.setValues(loginId, refreshToken, Duration.ofMillis(JwtUtil.REFRESH_TOKEN_TIME));
      }

    레디스에 리프레시 토큰을 저장하는 메서드이다.

    loginId와 refreshToken을 매개변수로 받고 redisDao.setValues를 사용하여 레디스에 저장한다.

    키는 loginId, 밸류는 refreshToken, 만료 시간은 Duration.ofMillis을 사용하여 JwtUtil에 선언된 리프레시 토큰 시간만큼 저장된다.

     

    포스트맨으로 실행 시 액세스 토큰, 레디스 토큰이 정상적으로 출력된다.

     

    레디스에도 정상적으로 리프레시 토큰이 저장되었다.

     

    리이슈 기능을 만드는데.. 포스트맨으로 실행하면 jwt string argument cannot be null or empty 에러가 나온다.

    아무리봐도 틀린 부분이 없는데 계속 출력된다. 구글링 해봐도 소용이 없다 ㅠㅠ.. 화가난다..

    얼른 고쳐봐야겠다.. 

Designed by Tistory.