본문 바로가기

오류

JWT 로그아웃 구현 시 [Redis parameter 오류]

AuthController

    /**
     * 로그아웃
     * 1. Redis내의 refresh_token 삭제
     * 2. Redis에 현재 access_token을 logout 상태로 등록
     * - 2.1. 해당 access_token의 남은 유효시간을 Redis의 TTL로 등록
     * 3. JwtTokenFilter 파일의 doFIlterInternal 메소드에서 redis에 logout 상태인지 검증하는 로직 추가
     * */
    @DeleteMapping("/api/v1/auth/logout")
    public ResponseEntity<?> logout(@RequestBody LogoutRequest request) {
        authService.logout(request);
        return ResponseEntity.status(HttpStatus.OK).body("User logout!");
    }

 

 

AuthServiceImpl

public void logout(LogoutRequest request) {
        String email = request.getEmail();
        String accessToken = request.getAccessToken();

        // Redis 내의 기존 refreshToken 삭제
        if (!refreshTokenRepository.existsById(email)){
            // 리프레시 토큰 없다고 예외처리 날려야됨
        }
        refreshTokenRepository.deleteById(email);


        // access_token의 남은 유효시간 가져오기 (Seconds 단위)
        Date expirationFromToken = jwtTokenProvider.getExpirationFromToken(accessToken);
        Date today = new Date();
        Integer sec = (int) ((expirationFromToken.getTime() - today.getTime()) / 1000);

        // access_token을 Redis의 key 값으로 등록
        logoutRepository.save(
                Logout.builder()
                        .id(accessToken)
                        .data("logout")
                        .expiration(sec)
                        .build()
                );
    }

 

 

JwtTokenFIlter

    // Logout 추가 이후
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException, ServletException, IOException {
        String accessToken = getTokenFromRequest(request);
        if (accessToken != null && jwtTokenProvider.validateToken(accessToken)) {
            if (logoutRepository.existsById(accessToken)) {
                response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
                response.getWriter().write("This token is logged out");
                return;
            }

            UsernamePasswordAuthenticationToken authentication = getAuthenticationFromToken(accessToken);
            authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
            SecurityContextHolder.getContext().setAuthentication(authentication);
        }

        filterChain.doFilter(request, response);
    }

 

분명 정상적으로 작동해야되는데 ...... 해야되는데 . . .. . 왜  ...

 

Parameter org.springframework.data.mapping.Parameter@efda9bae does not have a name

 

?????? ?? ? ? ? ? 

Preferences -> Build, Execution, Deployment -> Compiler -> Java Compiler

'-parameters' 추가

→ 정상 작동?? 왜??

 

+ 하고 안될 경우 module 하위의 out 폴더 삭제 후 다시 실행

 

그..렇구나.. ㅠ