blues_log
Published 2023. 8. 23. 20:41
2023-08-23 TIL TIL&WIL

오늘 학습한 내용

  • 최종 프로젝트 (블랙리스트에 redis 적용)

블랙리스트에 적용

엑세스 토큰이 만료되기 전에 로그아웃을 하게 되면 엑세스 토큰은 삭제되지 않고 남아있기 때문에 혹시라도 탈취당해 사용이 가능할 수 있다.

 

이를 방지하기 위해서 로그아웃 시 엑세스 토큰을 블랙리스트에 넣은 뒤 이를 사용하려고 하는 순간에 에러를 발생시킨다.

 

로그아웃 서비스는 다음과 같다.

    public ApiResponseDto logout(HttpServletRequest req, HttpServletResponse res) {
        // Refresh Token 삭제
        String refreshTokenUUID = jwtUtil.getUUID(req);
        RefreshToken refreshToken = refreshTokenRepository.findById(refreshTokenUUID).orElseThrow(() -> new IllegalArgumentException("Token not found"));
        refreshTokenRepository.delete(refreshToken);

        // Access Token 블랙리스트에 추가
        String accessToken = jwtUtil.getTokenFromRequest(req);
        Date expirationDate = jwtUtil.extractExpirationDateFromToken(jwtUtil.substringToken(accessToken));
        Long expirationDateMill = expirationDate.getTime() - System.currentTimeMillis(); // 토큰 만료 시간 - 현재 시간
        redisUtil.setBlackList(accessToken, "AccessToken", expirationDateMill);

        // 엑세스 토큰이 담겨있는 쿠키 삭제
        jwtUtil.deleteCookieWithAccessToken(accessToken, res);

        // 리프레시 토큰이 담겨있는 쿠키 삭제
        Cookie cookie = new Cookie("refreshToken", refreshTokenUUID);
        cookie.setPath("/");
        cookie.setMaxAge(0);
        res.addCookie(cookie);

        return new ApiResponseDto("로그아웃 성공", HttpStatus.OK.value());
    }

로그아웃을 하게 되면

  • 리프레시 토큰 삭제
  • 엑세스 토큰을 블랙리스트에 추가
  • 쿠키 삭제

순서로 코드가 수행된다.

 

블랙리스트에 등록된 엑세스 토큰은 

    // 토큰 검증
    public boolean validateToken(String token) {
        try {
            Jwts.parserBuilder()
                    // 비밀 값으로 복호화
                    .setSigningKey(key)
                    .build()
                    .parseClaimsJws(token);

            String checkToken = BEARER_PREFIX + token;
            // 블랙리스트에 있는 토큰인지 확인
            if(redisUtil.hasKeyBlackList(checkToken)) {
                throw new IllegalArgumentException("사용할 수 없는 토큰입니다. 다시 로그인 해주세요.");
            }

            return true;
        } catch (ExpiredJwtException e) {
            return false;
        } catch (Exception e) {
            throw new IllegalArgumentException(e.getMessage());
        }
    }

위 처럼 토큰 검증을 하는 메서드에서 확인하는 작업을 거친다.

 

추가로 RedisUtil 클래스는 다음과 같다.

@Component
@RequiredArgsConstructor
public class RedisUtil {
    private final RedisTemplate<String, Object> redisBlackListTemplate;

    // 블랙리스트에 저장
    public void setBlackList(String key, Object o, Long milliSeconds) {
        redisBlackListTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(o.getClass()));
        redisBlackListTemplate.opsForValue().set(key, o, milliSeconds, TimeUnit.MILLISECONDS);
    }

    // 블랙리스트에 해당 키가 있는지 조회
    public boolean hasKeyBlackList(String key) {
        return Boolean.TRUE.equals(redisBlackListTemplate.hasKey(key));
    }
}

 


CS 면접준비

질문 : mvc 패턴에 대해서 설명해주세요.

 

답변 : MVC는 Model - View - Controller의 약자로 많이 사용되는 디자인 패턴 중 하나입니다. 각각은 역할이 분리되어 있는데 Model은 데이터와 비즈니스 로직을 담당하며 DB와 연동되어 데이터를 저장하거나 조회하는 역할을 수행합니다. View는 UI를 담당합니다. Controller는 Model과 View 사이를 이어주는 역할을 합니다. View에서 입력받은 내용을 Model에 전달하고 Model에서 수행된 결과를 View에 반환하는 역할을 합니다.

'TIL&WIL' 카테고리의 다른 글

2023-09-01 TIL  (0) 2023.09.01
2023-08-25 TIL  (0) 2023.08.25
2023-08-22 TIL  (0) 2023.08.22
2023-08-21 TIL  (0) 2023.08.21
2023-08-17 TIL  (0) 2023.08.17