๐ป Spring Security docs ๊ฒ์๊ธ ๋ชฉ์ฐจ
1. [Spring Security] docs : Getting Started
[Spring Security] docs : Getting Started
Spring Security๋ ์ธ์ฆ, ๊ถํ๋ถ์ฌ ๋ฐ ์ผ๋ฐ์ ์ธ ๊ณต๊ฒฉ์ ๋ํ ๋ณดํธ๋ฅผ ์ ๊ณตํ๋ ํ๋ ์์ํฌ์ด๋ค. ๊ฐ๋ฐ์๊ฐ ๋ณด์ ์ค์ ์ ์ถ๊ฐ์ ์ผ๋ก ์ ๊ฒฝ์ฐ์ง ์๋๋ผ๋ ์์ ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น ๋ฅด๊ฒ ๊ตฌ์ถํ ์ ์๋
kiritoni.tistory.com
2. [Spring Security] docs : Architecture (1) - Filter
[Spring Security] docs : Architecture (1) - Filter
Spring Security docs Hello Spring Security :: Spring SecurityRunning Spring Boot Application $ ./mvnw spring-boot:run ... INFO 23689 --- [ restartedMain] .s.s.UserDetailsServiceAutoConfiguration : Using generated security password: 8e557245-73e2-4286-969a
kiritoni.tistory.com
3. [Spring Security] docs: Architecture (2) - DelegatingFilterProxy
[Spring Security] docs: Architecture (2) - DelegatingFilterProxy
Spring Security docs Hello Spring Security :: Spring SecurityRunning Spring Boot Application $ ./mvnw spring-boot:run ... INFO 23689 --- [ restartedMain] .s.s.UserDetailsServiceAutoConfiguration : Using generated security password: 8e557245-73e2-4286-969a
kiritoni.tistory.com
4. [Spring Security] docs: Architecture (3) - FilterChainProxy & SecurityFilterChain
[Spring Security] docs: Architecture (3) - FilterChainProxy & SecurityFilterChain
2024.08.29 - [Spring Boot] - [Spring Security] docs: Architecture (2) - DelegatingFilterProxy [Spring Security] docs: Architecture (2) - DelegatingFilterProxySpring Security docs Hello Spring Security :: Spring SecurityRunning Spring Boot Application $ .
kiritoni.tistory.com
๐ฑ Spring Security docs ๋ฐ๋ก๊ฐ๊ธฐ
Architecture :: Spring Security
The Security Filters are inserted into the FilterChainProxy with the SecurityFilterChain API. Those filters can be used for a number of different purposes, like authentication, authorization, exploit protection, and more. The filters are executed in a spec
docs.spring.io
FilterChainProxy
`FilterChainProxy`๋ Spring Security๊ฐ ์ ๊ณตํ๋ ํน๋ณํ ํํฐ๋ก, ์ฌ๋ฌ๊ฐ์ `SecurityFilterChain`์ ์ฌ์ฉํด ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์๋๋ก ์์ํ๋ค.

SecurityFilterChain
`SecurityFilterChain`์ `FilterChainProxy`๊ฐ ํ์ฌ ์์ฒญ์ ๋ํด ์ด๋ค ํํฐ ์ธ์คํด์ค๋ฅผ ํธ์ถํ ์ง ๊ฒฐ์ ํ๋ ๋ฐ ์ฌ์ฉ๋๋ค. ์ฌ๋ฌ `SecurityFilterChain`์ ์ ์ํ ์ ์๊ณ , ๊ฐ ์ฒด์ธ์ ์๋ก ๋ค๋ฅธ ํํฐ๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ์ฒด์ธ๋ค์ URLํจํด์ ๋ฐ๋ผ ์ ํ์ ์ผ๋ก ์ ์ฉ๋ ์๋ ์๋ค.

์ผ๋ฐ์ ์ผ๋ก `SecurityFilterChain`๊ณผ `FilterChainProxy`๋ bean์ด๋ฏ๋ก `DelegatingFilterProxy`์ ๋ํ๋๋ค๊ณ ์๊ฐํ ๊ฒ์ด๋ค. ํ์ง๋ง `SecurityFilter`๋ `DelegatingFilterProxy`๋์ SecurityFilterChain์ ๋ฑ๋ก๋๋ค.
์ด๋ ์ฌ๋ฌ๊ฐ์ง ์ด์ ์ ์ ๊ณตํ๋ค.
1. FilterChainProxy๋ ์์์ ์ด ๋๋ค.
Spring Security์ ๋ชจ๋ ์๋ธ๋ฆฟ ๊ด๋ จ ๊ธฐ๋ฅ์ด ์ด ํํฐ๋ฅผ ํตํด ์์๋๋ฏ๋ก, ๋๋ฒ๊น ์์๋ `FilterChainProxy`์ ๋๋ฒ๊ทธ ํฌ์ธํธ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข๋ค.
2. FilterChainProxy๋ ๋ณด์ ํํฐ๋ง์ ์ ํต์ฌ์ด๋ฏ๋ก, ํ์์ ์ธ ์์ ๋ค์ ์ํํ๋ค.
์๋ฅผ ๋ค์ด, *๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด *SecurityContext๋ฅผ ์ด๊ธฐํํ๋ค. ๋ํ Spring Security๋ฅผ ์ ์ฉํ์ฌ * HttpFirewall ๋ฑ ํน์ ์ ํ์ ๊ณต๊ฒฉ์ผ๋ก๋ถํฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณดํธํ๋ค.
* ๐ ๋ฉ๋ชจ๋ฆฌ ๋์
Spring Security๋ SecurityContext๋ฅผ ์ด๊ธฐํํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๋ค. ์์ฒญ์ด ์ฒ๋ฆฌ๋๋ ๋์ SecurityContext๋ ์ธ์ฆ๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ํฌํจํ๊ณ ์๋๋ฐ, ์์ฒญ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋ ํ์๋ SecurityContext๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ด๊ธฐํ๋์ง ์์ผ๋ฉด, ์ฌ์ฉ์ ์ ๋ณด๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ๊ณ์ ๋จ์์์ ์ ์๋ค. ์ด๋ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์ผ์ผํค๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ์ ์ํฅ์ ๋ฏธ์น๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด `FilterChainProxy`๋ ์์ฒญ ์ฒ๋ฆฌ ํ ํญ์ SecurityContext๋ฅผ ์ด๊ธฐํํด์ค๋ค.
* ๐ SecurityContext๋?
SecurityContext๋ Spring Security์์ ์ฌ์ฉ์์ ์ธ์ฆ ์ ๋ณด์ ๊ถํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ๊ฐ์ฒด์ด๋ค. ์ด๋ฅผ ํตํด ํ์ฌ ์ฌ์ฉ์๊ฐ ๋๊ตฌ์ธ์ง, ์ด๋ค ๊ถํ์ ๊ฐ๊ณ ์๋์ง ์ถ์ ํ ์ ์๋ค. SecurityContext๋ `SecurityContextHolder`์ ์ ์ฅ๋๋ฉฐ, ์ธ์ฆ๋ ์ฌ์ฉ์์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ค.
* ๐ HttpFirewall์ด๋?
HttpFirewall์ HTTP์์ฒญ์ ๋ํ ๋ณด์ ํํฐ๋ง์ ์ํํ์ฌ ํน์ ์ ํ์ ๊ณต๊ฒฉ์ผ๋ก๋ถํฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณดํธํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. Spring Security๋ ๊ธฐ๋ณธ์ ์ผ๋ก `StrictHttpFirewall`์ ์ฌ์ฉํ์ฌ ๋ณด์์ด ๊ฐํ๋ ํํฐ๋ง์ ์ ์ฉํ๋ค. HttpFirewall์ HTTP ์์ฒญ์์ ์์ฌ์ค๋ฌ์ด ํจํด์ ๊ฐ์งํ๊ณ ์ด๋ฅผ ์ฐจ๋จํ๋ค. (Path Traversal, HTTP Response Splitting, Cross-Site Scripting(XSS)) `FilterChainProxy`๋ HttpFirewall์ ํตํด ๋ค์ด์ค๋ ๋ชจ๋ HTTP ์์ฒญ์ ๊ฒ์ฌํ๊ณ , ๋ฌธ์ ๊ฐ ์๋ ์์ฒญ์ ํํฐ ์ฒด์ธ์ ๊ฑฐ์น๊ธฐ ์ ์ ์ฐจ๋จํ๋ค.
3. SecurityFilterChain์ ํธ์ถ ์์ ์ ๊ฒฐ์ ํ๋ ๋ฐ ์ ์ฐ์ฑ์ ์ ๊ณตํ๋ค.
์๋ธ๋ฆฟ ์ปจํ ์ด๋์์๋ ํํฐ ์ธ์คํด์ค๊ฐ ์ค์ง URL์ ๋ฐ๋ผ ํธ์ถ๋๋ค. ํ์ง๋ง `FilterChainProxy`๋ ์์ฒญ์ ์ฒ๋ฆฌํ ๋, `RequestMatcher` ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ `HttpServletRequest`์ "์ด๋ ํ ์ ๋ณด"๋ฅผ ๊ธฐ์ค์ผ๋ก ํํฐ ์ฒด์ธ์ ๊ฒฐ์ ํ ์ ์๋ค.
์๋ ๋ฐฉ์์ผ๋ก ์๋ฅผ ๋ค์ด๋ณด์.

A. ์์ฒญ ์ฒ๋ฆฌ
ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ์ ๋ณด๋ด๋ฉด, ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ `FilterChain`์ ๋ฐ๋ผ `DelegatingFilterProxy`๋ฅผ ํธ์ถํ๋ค.
`DelegatingFilterProxy`๋ ์คํ๋ง ์ปจํ ์คํธ์์ `FilterChainProxy`๋น์ ์ฐพ์ `doFilter()` ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
`FilterChainProxy`๋ ์์ฒญ URL๋ฐ ๊ธฐํ ์์ฒญ ํน์ฑ์ ๋ฐ๋ผ ์ ์ ํ `SecurityFilterChain`์ ๊ฒฐ์ ํ๋ค.
B. RequestMatcher๋ก ์ ์ ํ SecurityFilterChain์ ํ
`FilterChainProxy`๋ ์ฌ๋ฌ ๊ฐ์ `SecurityFilterChain` ์ค, ์์ฒญ์ ๊ฐ์ฅ ์ ํฉํ ์ฒด์ธ์ ์ ํํ๋ค.
`RequestMatcher` ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ์์ฒญ URL๋ฟ๋ง ์๋๋ผ `HttpServletRequest`์ ๋ค๋ฅธ ํน์ฑ (ํค๋, ๋งค๊ฐ๋ณ์ ๋ฑ)์ ๊ธฐ์ค์ผ๋ก `SecurityFilterChain`์ ์ ํํ ์ ์๋ค. ์ ํ๋ ์ฒซ ๋ฒ์งธ SecurityFilterChain๋ง์ด ํธ์ถ๋๋ฉฐ, ๋ค๋ฅธ ์ฒด์ธ์ ๋ฌด์๋๋ค.
C. SecurityFilterChain์ ๋ค์ค ๊ตฌ์ฑ
์ฌ๋ฌ `SecurityFilterChain`์ด ์์ ์ ์์ผ๋ฉฐ, ๊ฐ ์ฒด์ธ์ ์์ ๋ง์ ๋ณด์ ํํฐ ์ธ์คํด์ค๋ฅผ ๊ฐ์ง ์ ์๋ค.
โ ex 1.
`/api/messages/` URL์์ฒญ์ด ๋ค์ด์ค๋ฉด, `SecurityFilterChain(0)`์ `/api/**` ํจํด๊ณผ ์ผ์นํ๋ฏ๋ก `SecurityFilterChain(0)`๋ง ํธ์ถ๋๋ค. ์ด ์์ฒญ์ `SecurityFilterChain(n)`์๋ ์ผ์นํ ์ ์์ง๋ง, ์ฒซ ๋ฒ์งธ๋ก ์ผ์น๋๋ ์ฒด์ธ๋ง ์คํ๋๋ค.
โ ex 2.
`/messages/ ` URL์์ฒญ์ `/api/**` ํจํด์ ๋ง์ง ์์ผ๋ฏ๋ก, `FilterChainProxy`๋ ๋ค๋ฅธ `SecurityFilterChain`์ ๊ณ์ ์๋ํ์ฌ ์ต์ข ์ ์ผ๋ก `SecurityFilterChain(n)`์ ํธ์ถํ๋ค.
