๐ŸŒฟSpring

[Spring Security] SecurityFilterChain ํ•„ํ„ฐ ๋ชฉ๋ก ํ™•์ธํ•˜๊ธฐ (๋””๋ฒ„๊น…/๋กœ๊ทธ)

์†Œ์˜ ๐Ÿ€ 2025. 5. 19. 15:42

์ด๋ฒˆ์— ํ•˜๊ณ  ์žˆ๋Š” ๋””์Šค์ฝ”๋“œ์ž‡ ๋ฏธ์…˜์—์„œ

Spring Security๋ฅผ ๋„์ž…ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

๊ธฐ๋ณธ์ ์ธ SecurityFilterChain์„ ๋“ฑ๋กํ•˜๊ณ , ์ด๋•Œ ๋“ฑ๋ก๋˜๋Š” ํ•„ํ„ฐ ๋ชฉ๋ก์„ ๋””๋ฒ„๊น…ํ•ด๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ๊ธ€๋ง ๊ฒฐ๊ณผ ๋””๋ฒ„๊น… ์™ธ์—๋„ ๋กœ๊ทธ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์–ด์„œ ์˜ค๋Š˜์€ 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•„ํ„ฐ ๋ชฉ๋ก์„ ํ™•์ธํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

 

Spring Boot 3.4.0 / Spring Security 6.4.1 ํ™˜๊ฒฝ์—์„œ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด build.gradle์— ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

// spring security
implementation("org.springframework.boot:spring-boot-starter-security")
testImplementation("org.springframework.security:spring-security-test")

 

1. SecurityFilterChain ๋นˆ ๋””๋ฒ„๊น…

์•„๋ž˜์™€ ๊ฐ™์€ ๊ธฐ๋ณธ์ ์ธ ์„ค์ •๋งŒ ํ•œ SecurityFilterChani์„ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

  • csrf.disable(): CSRF ๋ณดํ˜ธ ๋น„ํ™œ์„ฑํ™”
    • CSRF๋Š” ์‚ฌ์ดํŠธ ๊ฐ„ ์š”์ฒญ ์œ„์กฐ ๊ณต๊ฒฉ์œผ๋กœ, CSRF ๋ณดํ˜ธ ์„ค์ •์„ ํ•˜๋ฉด ๋ณ€๊ฒฝ์„ ์ผ์œผํ‚ค๋Š” ์š”์ฒญ์— ๋Œ€ํ•ด CSRF ํ† ํฐ์ด ์—†์œผ๋ฉด 403 Forbidden์œผ๋กœ ๋ง‰์ง€๋งŒ, ์ง€๊ธˆ์€ ๊ณต๋ถ€ ๋‹จ๊ณ„์ด๋ฏ€๋กœ ์ด ๋ณดํ˜ธ ์„ค์ •๋„ disableํ•ฉ๋‹ˆ๋‹ค.
  • anyRequest.permitAll(): ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•ด ์ธ์ฆ ์—†์ด ํ—ˆ์šฉ
  • httpBasic(Customizer.withDefaults()): HTTP Basic ์ธ์ฆ์„ ๊ธฐ๋ณธ ์„ค์ •์œผ๋กœ ํ™œ์„ฑํ™”
    • Authorization ํ—ค๋”๋ฅผ ์“ฐ๋Š” HTTP Basic ์ธ์ฆ ๋ฐฉ์‹์„ ๋ณ„๋„์˜ ์„ค์ • ์—†์ด ๊ธฐ๋ณธ์œผ๋กœ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
@Configuration
public class SecurityConfig {

    @Bean
    SecurityFilterChain chain(HttpSecurity httpSecurity) throws Exception {
        httpSecurity
            .csrf(csrf -> csrf.disable())
            .authorizeHttpRequests(auth ->
                auth.anyRequest().permitAll())
            .httpBasic(Customizer.withDefaults());
        return httpSecurity.build();
    }
}

 

์—ฌ๊ธฐ์„œ return๋ฌธ์— ์ค‘๋‹จ์ ์„ ์ฐ๊ณ  ๋””๋ฒ„๊น…์„ ํ•ด๋ด…๋‹ˆ๋‹ค.

 

 

return๋ฌธ์ด ํ•„ํ„ฐ ์ฒด์ธ์ด ๋งŒ๋“ค์–ด์ง€๋Š” ์‹œ์ ์ž…๋‹ˆ๋‹ค.

Thread & Variables์—์„œ ํ•„ํ„ฐ ๋ชฉ๋ก์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์„ค์ •์— ๋”ฐ๋ผ ์กฐ๊ธˆ์”ฉ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

1. DisableEncodeUrlFilter

2. WebAsyncMangerIntegrationFilter

3. SecurityContextHolderFilter

4. HeaderWriterFilter

5. LogoutFilter

6. BasicAuthenticationFilter

7. RequestCacheAwareFilter

8. SecurityContextHolderAwareRequestFilter

9. AnonymousAuthenticationFilter

10. ExceptionTranslationFilter

11. AuthorizationFilter

 

2. ๋กœ๊ทธ๋กœ ํ™•์ธํ•˜๊ธฐ

๋””๋ฒ„๊น…์„ ํ•˜์ง€ ์•Š๊ณ 

Configuration ํด๋ž˜์Šค์— @EnableWebSecurity(debug=true) ์• ๋…ธํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•˜์—ฌ  ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

@Configuration
@EnableWebSecurity(debug = true)
public class SecurityConfig {

    @Bean
    SecurityFilterChain chain(HttpSecurity httpSecurity) throws Exception {
        httpSecurity
            .csrf(csrf -> csrf.disable())
            .authorizeHttpRequests(auth ->
                auth.anyRequest().permitAll())
            .httpBasic(Customizer.withDefaults());
        return httpSecurity.build();
    }
}

 

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ™”๋ฉด์„ ์ฝ˜์†”์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

********************************************************************
**********        Security debugging is enabled.       *************
**********    This may include sensitive information.  *************
**********      Do not use in a production system!     *************
********************************************************************

 

localhost:8080์œผ๋กœ ์•„๋ฌด ์š”์ฒญ์ด๋‚˜ ๋‚ ๋ ค๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์š”์ฒญ์— ๋Œ€ํ•ด ๋กœ๊ทธ๊ฐ€ ์ฐํž™๋‹ˆ๋‹ค.

1๋ฒˆ ๋ฐฉ๋ฒ•์—์„œ ๋ดค๋˜ ํ•„ํ„ฐ์™€ ๋˜‘๊ฐ™์ด ๋“ฑ๋ก๋๋„ค์š”.

************************************************************

Request received for GET '/favicon.ico':

org.apache.catalina.connector.RequestFacade@36eabd64

servletPath:/favicon.ico
pathInfo:null
headers: 
host: localhost:8080
connection: keep-alive
sec-ch-ua-platform: "Windows"
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36
sec-ch-ua: "Chromium";v="136", "Google Chrome";v="136", "Not.A/Brand";v="99"
sec-ch-ua-mobile: ?0
accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
sec-fetch-site: same-origin
sec-fetch-mode: no-cors
sec-fetch-dest: image
referer: http://localhost:8080/
accept-encoding: gzip, deflate, br, zstd
accept-language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7,ja;q=0.6
cookie: Idea-f58542b4=3011ef8d-4436-40f2-981e-2efba38b0a5a; JSESSIONID=C4394633990297DCB56BD92AEB538AC8


Security filter chain: [
  DisableEncodeUrlFilter
  WebAsyncManagerIntegrationFilter
  SecurityContextHolderFilter
  HeaderWriterFilter
  LogoutFilter
  BasicAuthenticationFilter
  RequestCacheAwareFilter
  SecurityContextHolderAwareRequestFilter
  AnonymousAuthenticationFilter
  ExceptionTranslationFilter
  AuthorizationFilter
]


************************************************************

 

์ด์ฒ˜๋Ÿผ ์ปค์Šคํ…€ ํ•„ํ„ฐ๋ฅผ ๋”ฐ๋กœ ๋“ฑ๋กํ•˜์ง€ ์•Š์•„๋„ SecurityConfig ์„ค์ •์„ ํ†ตํ•ด ์œ„์™€ ๊ฐ™์ด ํ•„ํ„ฐ ์ฒด์ธ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•