11package sopt .comfit .global .security .filter ;
22
33import io .jsonwebtoken .Claims ;
4+ import io .jsonwebtoken .ExpiredJwtException ;
5+ import io .jsonwebtoken .JwtException ;
6+ import io .jsonwebtoken .MalformedJwtException ;
7+ import io .jsonwebtoken .UnsupportedJwtException ;
48import jakarta .servlet .FilterChain ;
59import jakarta .servlet .ServletException ;
610import jakarta .servlet .http .HttpServletRequest ;
711import jakarta .servlet .http .HttpServletResponse ;
812import lombok .RequiredArgsConstructor ;
913import lombok .extern .slf4j .Slf4j ;
14+ import org .springframework .security .authentication .AuthenticationCredentialsNotFoundException ;
1015import org .springframework .security .core .context .SecurityContext ;
1116import org .springframework .security .core .context .SecurityContextHolder ;
17+ import org .springframework .security .core .userdetails .UsernameNotFoundException ;
1218import org .springframework .security .web .authentication .WebAuthenticationDetailsSource ;
1319import org .springframework .stereotype .Component ;
1420import org .springframework .web .filter .OncePerRequestFilter ;
1521import sopt .comfit .global .constants .Constants ;
22+ import sopt .comfit .global .exception .CommonErrorCode ;
1623import sopt .comfit .global .logging .MdcUtils ;
1724import sopt .comfit .global .security .info .JwtAuthenticationToken ;
1825import sopt .comfit .global .security .info .JwtUserInfo ;
@@ -30,11 +37,16 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter {
3037 private final JwtAuthenticationManager jwtAuthenticationManager ;
3138 private final JwtUtil jwtUtil ;
3239
40+ @ Override
41+ protected boolean shouldNotFilter (HttpServletRequest request ) {
42+ return Constants .NO_NEED_AUTH .stream ()
43+ .anyMatch (pattern -> Constants .PATH_MATCHER .match (pattern , request .getRequestURI ()));
44+ }
45+
3346 @ Override
3447 protected void doFilterInternal (HttpServletRequest request ,
3548 HttpServletResponse response ,
3649 FilterChain filterChain ) throws ServletException , IOException {
37-
3850 try {
3951 MdcUtils .generateTraceId ();
4052
@@ -45,18 +57,16 @@ protected void doFilterInternal(HttpServletRequest request,
4557 filterChain .doFilter (request , response );
4658 return ;
4759 }
60+
4861 String token = HeaderUtil .refineHeader (request , Constants .PREFIX_AUTH , Constants .BEARER );
4962 Claims claim = jwtUtil .validateToken (token );
5063 log .info ("claim: getUserId() = {}" , claim .get (Constants .CLAIM_USER_ID , Long .class ));
5164
5265 JwtUserInfo jwtUserInfo = JwtUserInfo .from (claim );
53-
5466 MdcUtils .setUserId (jwtUserInfo .userId ());
5567
5668 JwtAuthenticationToken unAuthenticatedToken = new JwtAuthenticationToken (jwtUserInfo );
57-
5869 JwtAuthenticationToken authenticatedToken = (JwtAuthenticationToken ) jwtAuthenticationManager .authenticate (unAuthenticatedToken );
59-
6070 log .info ("Authentication Successful: {}" , authenticatedToken );
6171
6272 authenticatedToken .setDetails (new WebAuthenticationDetailsSource ().buildDetails (request ));
@@ -65,10 +75,45 @@ protected void doFilterInternal(HttpServletRequest request,
6575 securityContext .setAuthentication (authenticatedToken );
6676 SecurityContextHolder .setContext (securityContext );
6777
78+ filterChain .doFilter (request , response );
79+ } catch (SecurityException e ) {
80+ log .error ("SecurityException: {}" , e .getMessage ());
81+ request .setAttribute ("errorCode" , CommonErrorCode .ACCESS_DENIED );
82+ filterChain .doFilter (request , response );
83+ } catch (MalformedJwtException e ) {
84+ log .error ("MalformedJwtException: {}" , e .getMessage ());
85+ request .setAttribute ("errorCode" , CommonErrorCode .TOKEN_MALFORMED_ERROR );
86+ filterChain .doFilter (request , response );
87+ } catch (ExpiredJwtException e ) {
88+ log .error ("ExpiredJwtException: {}" , e .getMessage ());
89+ request .setAttribute ("errorCode" , CommonErrorCode .EXPIRED_TOKEN_ERROR );
90+ filterChain .doFilter (request , response );
91+ } catch (UnsupportedJwtException e ) {
92+ log .error ("UnsupportedJwtException: {}" , e .getMessage ());
93+ request .setAttribute ("errorCode" , CommonErrorCode .TOKEN_UNSUPPORTED_ERROR );
94+ filterChain .doFilter (request , response );
95+ } catch (JwtException e ) {
96+ log .error ("JwtException: {}" , e .getMessage ());
97+ request .setAttribute ("errorCode" , CommonErrorCode .TOKEN_UNKNOWN_ERROR );
98+ filterChain .doFilter (request , response );
99+ } catch (IllegalArgumentException e ) {
100+ log .error ("IllegalArgumentException: {}" , e .getMessage ());
101+ request .setAttribute ("errorCode" , CommonErrorCode .TOKEN_TYPE_ERROR );
102+ filterChain .doFilter (request , response );
103+ } catch (UsernameNotFoundException e ) {
104+ log .error ("UsernameNotFoundException: {}" , e .getMessage ());
105+ request .setAttribute ("errorCode" , CommonErrorCode .AUTHENTICATION_USER_NOT_FOUND );
106+ filterChain .doFilter (request , response );
107+ } catch (AuthenticationCredentialsNotFoundException e ) {
108+ log .error ("AuthenticationCredentialsNotFoundException: {}" , e .getMessage ());
109+ request .setAttribute ("errorCode" , CommonErrorCode .INVALID_HEADER_VALUE );
110+ filterChain .doFilter (request , response );
111+ } catch (Exception e ) {
112+ log .error ("Unexpected filter exception: {}" , e .getMessage ());
113+ request .setAttribute ("errorCode" , CommonErrorCode .INTERNAL_SERVER_ERROR );
68114 filterChain .doFilter (request , response );
69115 } finally {
70116 MdcUtils .clear ();
71117 }
72118 }
73-
74119}
0 commit comments