Skip to content

Commit 07b8c0d

Browse files
authored
merge(filter) : JWT 필터가 인증 예외 경로를 건너뛰도록 개선
[🔀 merge] JWT 필터가 인증 예외 경로를 건너뛰도록 개선
2 parents d383d41 + 75f4c32 commit 07b8c0d

File tree

2 files changed

+44
-10
lines changed

2 files changed

+44
-10
lines changed

src/main/java/org/terning/terningserver/common/config/SecurityConfig.java

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,24 @@
1010
import org.springframework.security.config.http.SessionCreationPolicy;
1111
import org.springframework.security.web.SecurityFilterChain;
1212
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
13+
import org.terning.terningserver.common.security.jwt.application.JwtUserIdExtractor;
1314
import org.terning.terningserver.common.security.jwt.filter.CustomJwtAuthenticationEntryPoint;
1415
import org.terning.terningserver.common.security.jwt.filter.JwtAuthenticationFilter;
16+
import org.terning.terningserver.common.security.ratelimit.RateLimitingService;
17+
18+
import java.util.List;
1519

1620
@Configuration
1721
@EnableWebSecurity
1822
@RequiredArgsConstructor
1923
@EnableMethodSecurity
2024
public class SecurityConfig {
2125

22-
private final JwtAuthenticationFilter jwtAuthenticationFilter;
26+
private final JwtUserIdExtractor jwtUserIdExtractor;
27+
private final RateLimitingService rateLimitingService;
2328
private final CustomJwtAuthenticationEntryPoint customJwtAuthenticationEntryPoint;
24-
private static final String[] AUTH_WHITELIST = {
29+
30+
private static final List<String> AUTH_WHITELIST = List.of(
2531
"/v3/api-docs/**",
2632
"/swagger-ui.html",
2733
"/api/v1/swagger-ui/index.html#/**",
@@ -33,10 +39,16 @@ public class SecurityConfig {
3339
"/api/v1/push-status",
3440
"/api/v1/external/scraps/unsynced",
3541
"/api/v1/external/scraps/sync/result"
36-
};
42+
);
3743

3844
@Bean
3945
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
46+
JwtAuthenticationFilter jwtAuthenticationFilter = new JwtAuthenticationFilter(
47+
jwtUserIdExtractor,
48+
rateLimitingService,
49+
AUTH_WHITELIST
50+
);
51+
4052
return http
4153
.csrf(AbstractHttpConfigurer::disable)
4254
.formLogin(AbstractHttpConfigurer::disable)
@@ -46,9 +58,9 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
4658
.exceptionHandling(exceptionHandling ->
4759
exceptionHandling.authenticationEntryPoint(customJwtAuthenticationEntryPoint))
4860
.authorizeHttpRequests(auth -> {
49-
auth.requestMatchers(AUTH_WHITELIST).permitAll();
50-
auth.anyRequest().authenticated();
51-
})
61+
auth.requestMatchers(AUTH_WHITELIST.toArray(new String[0])).permitAll();
62+
auth.anyRequest().authenticated();
63+
})
5264
.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class)
5365
.build();
5466
}

src/main/java/org/terning/terningserver/common/security/jwt/filter/JwtAuthenticationFilter.java

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,10 @@
66
import jakarta.servlet.ServletException;
77
import jakarta.servlet.http.HttpServletRequest;
88
import jakarta.servlet.http.HttpServletResponse;
9-
import lombok.RequiredArgsConstructor;
109
import lombok.extern.slf4j.Slf4j;
1110
import org.springframework.http.HttpStatus;
1211
import org.springframework.security.core.context.SecurityContextHolder;
13-
import org.springframework.stereotype.Component;
12+
import org.springframework.util.AntPathMatcher;
1413
import org.springframework.web.filter.OncePerRequestFilter;
1514
import org.terning.terningserver.common.security.jwt.application.JwtUserIdExtractor;
1615
import org.terning.terningserver.common.security.jwt.auth.UserAuthentication;
@@ -19,17 +18,40 @@
1918
import org.terning.terningserver.common.util.IpAddressUtil;
2019

2120
import java.io.IOException;
21+
import java.util.List;
2222
import java.util.Optional;
2323

2424
import static org.springframework.http.HttpHeaders.AUTHORIZATION;
2525

26-
@Component
27-
@RequiredArgsConstructor
2826
@Slf4j
2927
public class JwtAuthenticationFilter extends OncePerRequestFilter {
3028

29+
private static final AntPathMatcher antPathMatcher = new AntPathMatcher();
30+
3131
private final JwtUserIdExtractor jwtUserIdExtractor;
3232
private final RateLimitingService rateLimitingService;
33+
private final List<String> authWhitelist;
34+
35+
public JwtAuthenticationFilter(
36+
JwtUserIdExtractor jwtUserIdExtractor,
37+
RateLimitingService rateLimitingService,
38+
List<String> authWhitelist
39+
) {
40+
this.jwtUserIdExtractor = jwtUserIdExtractor;
41+
this.rateLimitingService = rateLimitingService;
42+
this.authWhitelist = authWhitelist;
43+
}
44+
45+
@Override
46+
protected boolean shouldNotFilter(HttpServletRequest request) {
47+
String requestURI = request.getRequestURI();
48+
for (String pattern : this.authWhitelist) {
49+
if (antPathMatcher.match(pattern, requestURI)) {
50+
return true;
51+
}
52+
}
53+
return false;
54+
}
3355

3456
@Override
3557
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)

0 commit comments

Comments
 (0)