Skip to content

Commit 010df67

Browse files
authored
๐Ÿ› Bug - Security Filter๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜์—ฌ ์•ก์„ธ์Šค ํ† ํฐ ์žฌ๋ฐœ๊ธ‰ ๋กœ์ง์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค
๐Ÿ› Bug - Security Filter๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜์—ฌ ์•ก์„ธ์Šค ํ† ํฐ ์žฌ๋ฐœ๊ธ‰ ๋กœ์ง์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค
2 parents 3b5e2fb + 0305407 commit 010df67

4 files changed

Lines changed: 57 additions & 92 deletions

File tree

โ€Žsrc/main/java/sopt/comfit/auth/controller/AuthController.javaโ€Ž

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,13 @@ public LoginResponseDto kakaoCallback(
6161
HttpServletResponse response
6262
) {
6363
LoginQueryDto loginQueryDto = kakaoAuthService.getKakaoUserInfoByCode(code);
64-
response.addCookie(new Cookie("refreshToken", loginQueryDto.jwtDto().refreshToken()));
64+
65+
Cookie cookie = new Cookie("refreshToken", loginQueryDto.jwtDto().refreshToken());
66+
cookie.setPath("/");
67+
cookie.setHttpOnly(true);
68+
cookie.setMaxAge(7 * 24 * 60 * 60); // 7์ผ (refreshToken ๋งŒ๋ฃŒ์™€ ๋งž์ถฐ์„œ ์กฐ์ •)
69+
response.addCookie(cookie);
70+
6571
return LoginResponseDto.of(loginQueryDto);
6672
}
6773
}

โ€Žsrc/main/java/sopt/comfit/global/security/config/SecurityConfig.javaโ€Ž

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
import sopt.comfit.global.security.exception.CustomAccessDeniedHandler;
1515
import sopt.comfit.global.security.exception.CustomAuthenticationEntryPointerHandler;
1616
import sopt.comfit.global.security.filter.JwtAuthenticationFilter;
17-
import sopt.comfit.global.security.filter.JwtExceptionFilter;
1817

1918
@Configuration
2019
@EnableWebSecurity
@@ -24,7 +23,6 @@ public class SecurityConfig {
2423
private final CustomAuthenticationEntryPointerHandler customAuthenticationEntryPointerHandler;
2524
private final CustomAccessDeniedHandler customAccessDeniedHandler;
2625
private final JwtAuthenticationFilter jwtAuthenticationFilter;
27-
private final JwtExceptionFilter jwtExceptionFilter;
2826

2927

3028
@Bean
@@ -54,10 +52,6 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
5452
jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class
5553
)
5654

57-
.addFilterBefore(
58-
jwtExceptionFilter, JwtAuthenticationFilter.class
59-
)
60-
6155
.getOrBuild();
6256

6357
}

โ€Žsrc/main/java/sopt/comfit/global/security/filter/JwtAuthenticationFilter.javaโ€Ž

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,25 @@
11
package sopt.comfit.global.security.filter;
22

33
import io.jsonwebtoken.Claims;
4+
import io.jsonwebtoken.ExpiredJwtException;
5+
import io.jsonwebtoken.JwtException;
6+
import io.jsonwebtoken.MalformedJwtException;
7+
import io.jsonwebtoken.UnsupportedJwtException;
48
import jakarta.servlet.FilterChain;
59
import jakarta.servlet.ServletException;
610
import jakarta.servlet.http.HttpServletRequest;
711
import jakarta.servlet.http.HttpServletResponse;
812
import lombok.RequiredArgsConstructor;
913
import lombok.extern.slf4j.Slf4j;
14+
import org.springframework.security.authentication.AuthenticationCredentialsNotFoundException;
1015
import org.springframework.security.core.context.SecurityContext;
1116
import org.springframework.security.core.context.SecurityContextHolder;
17+
import org.springframework.security.core.userdetails.UsernameNotFoundException;
1218
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
1319
import org.springframework.stereotype.Component;
1420
import org.springframework.web.filter.OncePerRequestFilter;
1521
import sopt.comfit.global.constants.Constants;
22+
import sopt.comfit.global.exception.CommonErrorCode;
1623
import sopt.comfit.global.logging.MdcUtils;
1724
import sopt.comfit.global.security.info.JwtAuthenticationToken;
1825
import 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
}

โ€Žsrc/main/java/sopt/comfit/global/security/filter/JwtExceptionFilter.javaโ€Ž

Lines changed: 0 additions & 80 deletions
This file was deleted.

0 commit comments

Comments
ย (0)