티스토리 뷰
이전 글에선 JWT 검증 코드를 인터셉터에 적용해봤다.
이번 글에선 Filter에 적용해보자.
먼저 가볍게 Filter에 대해 짚고 넘어가보자.
Filter는 Interceptor와 다르게 Dispatcher Servlet이 동작하기 이전에 위치한다.
그리고 별도의 필터에 대한 설정이 없으면 모든 요청에 대해서 반드시 한번 실행이 된다.
때문에 인터셉터보다는 더 범용적이고, 한번은 무조건 타야하는 보안, 인증/인가 작업이 주로 Filter에서 이뤄지게 된다.
흔히 알고 있는 스프링 시큐리티의 필터 체인들이 여기서 수행된다.
Filter는 별도의 설정없이 Filter 인터페이스만 implements해도 요청이 들어올 때마다 실행되기 때문에 구현은 비교적 간단하다.
구현
여기서부터 등장할 jwt 관련 코드는 이전 글에서 확인 할 수 있다.
필터 구현하기
@Component
@RequiredArgsConstructor
public class JwtFilter extends OncePerRequestFilter {
private final JwtTokenProvider jwt;
private final ComponentCommonUtils componentCommonUtils;
private final UserRepository userRepository;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
String token = jwt.extractJwtTokenFromHeader(request);
if (ObjectUtils.isEmpty(token)) {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
return;
}
User user = userRepository.findByUserId(componentCommonUtils.getUserId());
if (ObjectUtils.isEmpty(user)) {
throw new BadRequestException("등록되지 않은 사용자");
}
filterChain.doFilter(request, response);
}
}
OncePerRequestFilter는 필터가 반드시 한번만 동작한다고 보장해주는 필터 인터페이스이다.
단순히 필터 하나만을 등록해서 검증할 것이라면,
이거 외에도 그냥 Filter, OncePerRequestFilter의 부모 클래스인 GenericFilterBean을 사용해도 문제가 없다.
(Jwt필터를 스프링 시큐리티에 등록하는 부분에서는 문제가 생기지만 이 문제는 다음에 다루도록 하겠다.)
옛날 스프링 MVC를 쓰던 시절엔 필터는 빈으로 만들 수 없다. 고 배웠었다.
그러나 스프링이 버전업되고 스프링부트까지 넘어오면서, 필터도 빈으로 관리할 수 있게 됐으며, 스프링에서 제공하는 기능을 사용할 수 있게 됐다.(기본적으로 Filter가 스프링 외부에 위치해서 스프링 기능을 사용할 수 없었다.)
덕분에 편하게 의존성 주입을 통해, 외부 빈들을 편하게 가져올 수 있게 됐다.
여기서도 인터셉터 때와 마찬가지로 , jwt 토큰 내에 있는 userId를 검증해 실제 사용자인지 아닌지를 판단하도록 구현했다.
마치며
단순히 여기까지만 구현하면, 인터셉터에 jwt 검증을 구현하는데 비해 장점이 느껴지지 않는다.
그리고 필터에서 구현하는 장점 중 하나인 보안 부분도 많이 부각되지 않는다.
때문에 프로젝트에서는 스프링 시큐리티와 함께 사용하는 방법을 선택해서 사용했다.
그래서 다음 글을 작성하기 전에 스프링 시큐리티에 대해 짚고 넘어가보려고 한다.
이전 포스팅
'개발 > SPRING' 카테고리의 다른 글
스프링부트에서 SMS 본인 인증 구현하기 - 2. 어뷰징 막기 (0) | 2023.10.30 |
---|---|
스프링부트에서 SMS 본인 인증 구현하기 - 1. Twilio로 구현 (1) | 2023.10.24 |
스프링부트에서 JWT 적용하기 - 2. 인터셉터(Interceptor)에 적용 (1) | 2023.10.06 |
스프링부트에서 JWT 적용하기 - 1. JWT란? (0) | 2023.10.05 |
SpringBoot에서 profiles group으로 서버 profile 정리하기 (0) | 2023.08.23 |
- Total
- Today
- Yesterday
- Kotlin
- 오블완
- docker
- AWS
- 티스토리챌린지
- 후쿠오카
- MySQL
- CloudFront
- cache
- terraform
- lambda
- java
- springboot
- Log
- serverless
- 스프링부트
- AWS EC2
- openAI API
- 람다
- OpenAI
- JWT
- GIT
- elasticsearch
- EKS
- S3
- AOP
- ChatGPT
- Elastic cloud
- OpenFeign
- 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 |