반응형
JwtToken의 유효성을 검증할 인터셉터 클래스를 작성하자
프로젝트 구성은 아래의 포스트에 있다.👇🏻👇🏻
1. JwtTokenInterceptor - 인터셉터 클래스 설정
- jwtTokenInterceptor는 Spring의 HandlerInterceptor 인터페이스를 구현한 클래스로, HTTP 요청이 컨트롤러에 도달하기 전에 실행되는 로직을 담고 있다. 이 인터셉터는 주로 JWT 토큰의 유효성을 검사하는 역할을 한다.
- 이 인터셉터는 JWT 토큰의 유효성을 검사한다. 유효한 토큰이 아니거나 토큰이 전혀 없는 경우 요청을 거부한다. 유효한 토큰이 있는 경우 요청을 통과시킨다.
@Slf4j
@Component
public class JwtTokenInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(
HttpServletRequest request,
@NonNull HttpServletResponse response,
@NonNull Object handler
) {
// favicon.ico 요청에 대한 JWT 토큰 검증을 건너뛰기
if (request.getRequestURI().equals("/favicon.ico")) {
return true;
}
String token = null;
// 쿠키에서 JWT 토큰 가져오기
jakarta.servlet.http.Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (jakarta.servlet.http.Cookie cookie : cookies) {
if (cookie.getName().equals("jwt")) {
token = cookie.getValue();
break;
}
}
}
if (token != null) {
if (TokenUtils.isValidToken(token)) {
String userId = TokenUtils.getUserIdFromToken(token);
if (userId == null) {
log.debug("token isn't userId");
throw new ProfileApplicationException(ErrorCode.AUTH_TOKEN_NOT_MATCH);
}
return true;
} else {
throw new ProfileApplicationException(ErrorCode.AUTH_TOKEN_INVALID);
}
} else {
throw new ProfileApplicationException(ErrorCode.AUTH_TOKEN_IS_NULL);
}
}
}
2. preHandle 메서드 설명
2-1. preHandle 메서드 내용
- 이 코드는 스프링 부트 애플리케이션에서 HTTP 요청을 사전에 처리하는 preHandle 메서드를 구현한 예시다. 이 메서드는 특히 JWT(Jason Web Token) 기반의 인증을 처리하는데 중점을 두고 있다.
@Override
public boolean preHandle(
HttpServletRequest request,
@NonNull HttpServletResponse response,
@NonNull Object handler
) {
// favicon.ico 요청에 대한 JWT 토큰 검증을 건너뛰기
if (request.getRequestURI().equals("/favicon.ico")) {
return true;
}
String token = null;
// 쿠키에서 JWT 토큰 가져오기
jakarta.servlet.http.Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (jakarta.servlet.http.Cookie cookie : cookies) {
if (cookie.getName().equals("jwt")) {
token = cookie.getValue();
break;
}
}
}
if (token != null) {
if (TokenUtils.isValidToken(token)) {
String userId = TokenUtils.getUserIdFromToken(token);
if (userId == null) {
log.debug("token isn't userId");
throw new ProfileApplicationException(ErrorCode.AUTH_TOKEN_NOT_MATCH);
}
return true;
} else {
throw new ProfileApplicationException(ErrorCode.AUTH_TOKEN_INVALID);
}
} else {
throw new ProfileApplicationException(ErrorCode.AUTH_TOKEN_IS_NULL);
}
}
2-2. favicon.ico 요청 처리:
- 먼저, 메서드는 /favicon.ico에 대한 요청을 확인하고, 이러한 요청은 JWT 검증 과정을 건너뛰도록 처리한다. 이는 웹 브라우저가 자동으로 생성하는 특정 요청에 대한 불필요한 처리를 방지하기 위함이다.
2-3. 쿠키에서 JWT 토큰 가져오기:
- 다음으로, HTTP 요청의 쿠키에서 'jwt'라는 이름의 쿠키를 찾아 해당 쿠키의 값을 토큰으로 사용한다. 토큰이 발견되면, TokenUtils 클래스를 사용하여 토큰의 유효성을 검증한다. 토큰이 유효한 경우, 토큰에서 사용자 ID를 추출하고, 이를 통해 요청이 유효한 사용자에 의해 이루어졌는지를 확인한다. 만약 사용자 ID가 없거나 토큰이 유효하지 않으면, ProfileApplicationException을 발생시켜 인증 실패를 나타낸다.
지금 코드에서 사용한 JWT 유틸리티 클래스를 다음 포스트에서 작성해 보자👇🏻👇🏻
반응형
'Spring Security' 카테고리의 다른 글
Spring Boot 3 & Security 6 시리즈: UserDetailsService, DTO 작성하기 (8편) (0) | 2023.08.07 |
---|---|
Spring Boot 3 & Security 6 시리즈: JWT Util 클래스 작성 (7편) (0) | 2023.08.07 |
Spring Boot 3 & Security 6 시리즈: AuthenticationProvider, 인증 핸들러 구현하기 (5편) (0) | 2023.08.07 |
Spring Boot 3 & Security 6 시리즈: JWT 인증 필터 JwtAuthorizationFilter 작성(4편) (0) | 2023.08.07 |
Spring Boot 3 & Security 6 시리즈: WebConfig 클래스 작성 (3편) (0) | 2023.08.07 |