티스토리 뷰
이전 글에서 JWT가 무엇이고 어떤 데이터를 실어서 보낼 수 있나를 알아봤다.
그럼 이번 글부터는 어떻게 적용하면 될지 알아보자.
이번 글에서 소개할 방식은 interceptor에 적용하는 방식이다.
interceptor는 스프링에서 제공하는 컨트롤러 이전에 위치하는 공통처리부 중 하나이다.
아래 그림을 확인하면 편하다.
공통처리부에 관한 글을 예전에 썼었는데, 이 때는 스프링 MVC를 쓰던 시절이라 필터와 인터셉터를 xml에서 제어를 하도록 구성되어 있었다. (왜 썼는지, 어떤 역할을 하는지 보다 이런게 있다라고 정리한 글이었다)
여기서 추가적으로 간단하게 짚고 넘어가면, Interceptor는 스프링 내부에서 Dispatcher Servlet 이후에 동작한다.
컨트롤러 앞단에 위치해 요청과 응답을 간단히 가공하는 역할을 하며,
이번 포스팅인 JWT 사용자 인증과 같은 인증과 인가 관련 작업도 인터셉터에서 처리할 수 있다.
(필터보다는 세부적인 역할을 담당한다. 필터 관련글은 다음 포스팅에 작성하려고 한다.)
이번 포스팅에는 SpringBoot에서 Interceptor를 사용하면서, 여기서 JWT를 검증하는 방법을 알아보자.
구현
여기서부터 등장할 jwt 관련 코드는 이전 글에서 확인 할 수 있다.
1. 인터셉터(Interceptor) 생성
@Component
@RequiredArgsConstructor
public class AuthenticationInterceptor implements HandlerInterceptor {
private final JwtTokenProvider jwt;
private final UserRepository userRepository;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String token = jwt.extractJwtTokenFromHeader(request);
if (ObjectUtils.isEmpty(token)) {
response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
return false;
}
User user = userRepository.findByUserId(componentCommonUtils.getUserId());
if (ObjectUtils.isEmpty(user)) {
throw new BadRequestException("등록되지 않은 사용자");
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
HandlerInterceptor 를 implements를 받으면 preHandler, postHandler, afterCompletion이 Override 매서드로 생성된다.
각 매서드들은 이름 그대로의 역할을 한다. 자세한 설명
검증은 컨트롤러에 들어가기 전에 필요하기 때문에, preHandler에서 검증 코드를 구현했다.
여기선 예시로 사용하기 위해 간단하게 userId로 존재여부를 체크하는 정도만 검증했다.
그리고 검증에 필요한 부분을 DI 받아야하기 때문에 @Component를 통해 인터셉터를 빈으로 만들었다.
2. 인터셉터(Interceptor) 등록
이렇게 만든 인터셉터는 WebMvcConfigurer에 등록해줘야 한다.
@Configuration
@RequiredArgsConstructor
public class WebMvcConfig implements WebMvcConfigurer {
private final AuthenticationInterceptor authenticationInterceptor;
private final List<String> addEndPointList = Arrays.asList(
...
);
private final List<String> excludePointList = Arrays.asList(
...
);
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authenticationInterceptor)
.addPathPatterns(addEndPointList)
.excludePathPatterns(excludePointList);
}
}
addPathPatterns은 인터셉터를 태울 URL의 패턴을 의미하고,
excludePathPatterns들은 인터셉터를 태우지 않을 URL의 패턴을 의미한다.
BaseURL을 제외하고 리스트에 넣어주면 된다.
이렇게 구성하면 jwt 토큰 검증이 필요한 api들이 인터셉터로 빠지고, 공용으로 사용할 api들은 통과하도록 구성된다.
마치며
이전에 썼던 인터셉터에 대한 글이 떠올라 잠깐 들여다 봤는데,
당시에는 인터셉터가 어떤 특성이 있는지에 대한 이해가 부족 했던 것 같아서 이번 기회에 조금 더 들여다봤다.
다음은 필터에 JWT 토큰을 적용하는 방법을 알아보면서 스프링 시큐리티를 찍먹해봐야할 것 같다.
이전 포스팅
'개발 > SPRING' 카테고리의 다른 글
스프링부트에서 SMS 본인 인증 구현하기 - 1. Twilio로 구현 (1) | 2023.10.24 |
---|---|
스프링부트에서 JWT 적용하기 - 3. 필터(filter)에 적용 (0) | 2023.10.10 |
스프링부트에서 JWT 적용하기 - 1. JWT란? (0) | 2023.10.05 |
SpringBoot에서 profiles group으로 서버 profile 정리하기 (0) | 2023.08.23 |
POST 요청 처리 후 HttpServletRequest에서 RequestBody 가져오기 - RequestWrapper 추가하기 (0) | 2023.08.22 |
- Total
- Today
- Yesterday
- EKS
- openAI API
- lambda
- 람다
- GIT
- CloudFront
- MySQL
- elasticsearch
- terraform
- S3
- AWS EC2
- OpenFeign
- AOP
- cache
- 후쿠오카
- serverless
- OpenAI
- Log
- docker
- ChatGPT
- java
- JWT
- 티스토리챌린지
- Kotlin
- 오블완
- 스프링부트
- Elastic cloud
- AWS
- springboot
- Spring
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |