2323@ Component
2424@ RequiredArgsConstructor
2525public class JwtAuthenticationFilter extends OncePerRequestFilter {
26-
27- private final JwtProvider jwtProvider ;
28- private final UserDetailsService userDetailsService ;
29- private final AntPathMatcher antPathMatcher = new AntPathMatcher ();
30-
26+ // 토큰 없이도 가능하게
3127 private static final List <String > WHITE_LIST = List .of (
3228 "/swagger-ui/**" ,
3329 "/v3/api-docs/**" ,
@@ -38,46 +34,35 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter {
3834 "/auth/refresh"
3935 );
4036
41- @ Override
42- protected boolean shouldNotFilter (HttpServletRequest request ) {
43- if (request .getMethod ().equalsIgnoreCase (HttpMethod .OPTIONS .name ())) {
44- return true ;
45- }
46- return WHITE_LIST .stream ().anyMatch (white -> antPathMatcher .match (white , request .getRequestURI ()));
47- }
37+ private final JwtProvider jwtProvider ;
38+ private final UserDetailsService userDetailsService ;
39+ private final AntPathMatcher antPathMatcher = new AntPathMatcher ();
4840
4941 @ Override
50- protected void doFilterInternal (
51- @ NonNull HttpServletRequest request ,
52- @ NonNull HttpServletResponse response ,
53- @ NonNull FilterChain filterChain
54- ) throws ServletException , IOException {
55-
56- final String authHeader = request .getHeader ("Authorization" );
57-
58- if (authHeader == null || !authHeader .startsWith ("Bearer " )) {
59- filterChain .doFilter (request , response );
60- return ;
61- }
62-
42+ protected void doFilterInternal (HttpServletRequest request , HttpServletResponse response , FilterChain filterChain ) throws ServletException , IOException {
6343 try {
64- Long memberId = jwtProvider .getMemberIdAndValidateToken (authHeader );
65- if (SecurityContextHolder .getContext ().getAuthentication () == null ) {
66- UserDetails userDetails = this .userDetailsService .loadUserByUsername (memberId .toString ());
67- UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken (
68- userDetails ,
69- null ,
70- userDetails .getAuthorities ()
71- );
72- authToken .setDetails (
73- new WebAuthenticationDetailsSource ().buildDetails (request )
74- );
75- SecurityContextHolder .getContext ().setAuthentication (authToken );
76- }
44+ Long memberId = jwtProvider .getMemberIdAndValidateToken (request .getHeader ("Authorization" ));
45+
46+ UserDetails userDetails = userDetailsService .loadUserByUsername (memberId .toString ());
47+ UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken (
48+ userDetails ,
49+ null ,
50+ userDetails .getAuthorities ()
51+ );
52+ authentication .setDetails (new WebAuthenticationDetailsSource ().buildDetails (request ));
53+ SecurityContextHolder .getContext ().setAuthentication (authentication );
7754 } catch (Exception e ) {
78- SecurityContextHolder .clearContext ();
55+ response .setStatus (HttpServletResponse .SC_UNAUTHORIZED );
56+ response .getWriter ().write ("{\" error\" : \" " + e .getMessage () + "\" }" );
57+ return ;
7958 }
8059
8160 filterChain .doFilter (request , response );
8261 }
62+
63+ @ Override
64+ protected boolean shouldNotFilter (HttpServletRequest request ) throws ServletException {
65+ // 더 안정적인 AntPathMatcher.match() 로 수정
66+ return WHITE_LIST .stream ().anyMatch (white -> antPathMatcher .match (white , request .getRequestURI ()));
67+ }
8368}
0 commit comments