์ง€๊ธˆ๊นŒ์ง€ ๋Œ€๋žต์ ์ธ Spring Security ์˜ ๊ตฌ์กฐ์™€ SecurityFilterChain ์˜ ๋“ฑ๋ก๊ณผ์ •์„ ์•Œ์•„๋ณด์•˜๋‹ค. SecurityFilterChain ์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ SecurityFilter ๋“ค๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ, ๊ณผ์—ฐ ์–ด๋–ค ์‹์œผ๋กœ ๋˜์–ด ์žˆ์„์ง€ SecurityFilterChain ์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ์— ๋Œ€ํ•˜์—ฌ ๋ถ„์„ํ•ด๋ณด์ž.

๋‚ด๋ถ€ ๊ตฌ์กฐ ๋ถ„์„

@EnableWebSecurity Debug Mode
@EnableWebSecurity(debug = true)  

์œ„์™€ ๊ฐ™์ด Spring Security ์˜ ์›น ๋ณด์•ˆ ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•˜๋Š” annotation ์ธ @EnableWebSecurity ์— Debug Mode ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์ข€ ๋” ์‰ฝ๊ฒŒ SecurityFilterChain ์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

Debug Mode ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์œ„์™€ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. SpringConfig class ์—์„œ ์•„๋ฌด๋Ÿฐ Custom SecurityFilterChain ์„ define ํ•˜์ง€ ์•Š๊ณ  ๊ธฐ๋ณธ ์„ค์ •์—์„œ์˜ SecurityFilterChain ์˜ ๊ตฌ์กฐ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ์—ฌ๋Ÿฌ ๊ฐœ์˜ Filter ๋“ค์ด ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

Spring Security Filters

๊ทธ๋Ÿผ Spring Security ์—์„œ ์ œ๊ณตํ•˜๋Š” Filter ๋“ค์—๋Š” ์–ด๋–ค ๊ฒƒ๋“ค์ด ์žˆ์„๊นŒ?

ํ•„ํ„ฐ๋ช…์—ญํ•  ์„ค๋ช…
DisableEncodeUrlFilterURL์— ์„ธ์…˜ID๊ฐ€ ์ธ์ฝ”๋”ฉ๋˜์–ด ๋…ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€, ์„ธ์…˜ID๊ฐ€ URL์— ํฌํ•จ๋˜์ง€ ์•Š๋„๋ก ์‘๋‹ต์„ ๋ž˜ํ•‘
WebAsyncManagerIntegrationFilter๋น„๋™๊ธฐ(Async) ์š”์ฒญ ์ฒ˜๋ฆฌ ์‹œ SecurityContext๊ฐ€ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ๋„ ๊ณต์œ ๋  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›
SecurityContextHolderFilter์ ‘๊ทผํ•œ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•˜์—ฌ Security Context ๋กœ ๊ด€๋ฆฌ
HeaderWriterFilter์‘๋‹ต์— ๋ณด์•ˆ ๊ด€๋ จ HTTP ํ—ค๋”(X-Frame-Options, XSS-Protection ๋“ฑ)๋ฅผ ์ถ”๊ฐ€
CorsFilterCross-Origin Resource Sharing(CORS) ์ •์ฑ… ์ ์šฉ ๋ฐ ์ฒ˜๋ฆฌ
CsrfFilterCSRF(Cross-Site Request Forgery) ๊ณต๊ฒฉ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด CSRF ํ† ํฐ ๊ฒ€์‚ฌ
LogoutFilter๋กœ๊ทธ์•„์›ƒ ์š”์ฒญ ์ฒ˜๋ฆฌ ๋ฐ ์„ธ์…˜ ๋ฌดํšจํ™”
UsernamePasswordAuthenticationFilter๋กœ๊ทธ์ธ ํผ์˜ ์•„์ด๋””/๋น„๋ฐ€๋ฒˆํ˜ธ ์ธ์ฆ ์ฒ˜๋ฆฌ
DefaultResourcesFilter์ •์  ๋ฆฌ์†Œ์Šค(์ด๋ฏธ์ง€, CSS, JS ๋“ฑ) ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜์—ฌ ๋ณด์•ˆ ํ•„ํ„ฐ ์ฒด์ธ์—์„œ ์ œ์™ธ
DefaultLoginPageGeneratingFilter๋ณ„๋„ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๊ฐ€ ์—†์„ ๋•Œ ๊ธฐ๋ณธ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋ฅผ ์ž๋™ ์ƒ์„ฑ
DefaultLogoutPageGeneratingFilter๋ณ„๋„ ๋กœ๊ทธ์•„์›ƒ ํŽ˜์ด์ง€๊ฐ€ ์—†์„ ๋•Œ ๊ธฐ๋ณธ ๋กœ๊ทธ์•„์›ƒ ํŽ˜์ด์ง€๋ฅผ ์ž๋™ ์ƒ์„ฑ
BasicAuthenticationFilterHTTP Basic ์ธ์ฆ ํ—ค๋”(Authorization) ๊ธฐ๋ฐ˜ ์ธ์ฆ ์ฒ˜๋ฆฌ
RequestCacheAwareFilter์ธ์ฆ ์ „ ์š”์ฒญ ์ •๋ณด๋ฅผ ์บ์‹œํ•˜์—ฌ, ์ธ์ฆ ์„ฑ๊ณต ํ›„ ์›๋ž˜ ์š”์ฒญ์œผ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ
SecurityContextHolderAwareRequestFilterHttpServletRequest๋ฅผ ๋ž˜ํ•‘ํ•˜์—ฌ SecurityContext์— ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ง€์›
AnonymousAuthenticationFilter์ธ์ฆ๋˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž๋ฅผ ์ต๋ช… ์‚ฌ์šฉ์ž๋กœ ์ฒ˜๋ฆฌ
ExceptionTranslationFilter์ธ์ฆ/์ธ๊ฐ€ ์‹คํŒจ ์‹œ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋˜๋Š” ์—๋Ÿฌ ์‘๋‹ต ์ฒ˜๋ฆฌ
AuthorizationFilterURL ๋ฐ ๋ฆฌ์†Œ์Šค ์ ‘๊ทผ ๊ถŒํ•œ(์ธ๊ฐ€) ๊ฒ€์‚ฌ, Spring Security 5.5๋ถ€ํ„ฐ FilterSecurityInterceptor๋ฅผ ๋Œ€์ฒด
Custom Filter ๋“ฑ๋ก

ํŠน์ • SecurityFilterChain ์— Filter ๋ฅผ ๋“ฑ๋กํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹ค์Œ method ๋“ค์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

.addFilterBefore(customFilter, beforeFilter.class);
  • addFilterBefore: ์ง€์ •ํ•œ Filter ์•ž์— Custom Filter ๋ฅผ ์ถ”๊ฐ€
  • addFilterAfter: ์ง€์ •ํ•œ Filter ๋’ค์— Custom Filter ๋ฅผ ์ถ”๊ฐ€
  • addFilterAt: ์ง€์ •ํ•œ Filter ์ž๋ฆฌ์—(๊ฐ™์€ order ๋กœ) Custom Filter ๋ฅผ ์ถ”๊ฐ€

๊ทธ๋Ÿฌ๋‚˜ ๊ฐ™์€ order ์— ์—ฌ๋Ÿฌ Filter ๊ฐ€ ์กด์žฌํ•˜๋ฉด ์• ๋งคํ•œ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•œ๋‹ค.