์๋ก
Java ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณด์์ ์ํ ๊ฐ๋ ฅํ๊ณ ํ์ฅ ๊ฐ๋ฅํ ํ๋ ์์ํฌ์ธ Spring Security๊ฐ ๋ฌด์์ธ์ง ์์๋ณด๊ณ ์ด๋ป๊ฒ ๋์ ๊ฐ๋์ง ์์๋ณด๊ณ ์ ํ๋ค.
๊ฐ๋
Spring ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ํต์ฌ ๋ณด์ ๊ธฐ๋ฅ์ธ ์ธ์ฆ(Authentication)๊ณผ ์ธ๊ฐ(Authorization)๋ฅผ ๋๋ ํ๋ ์์ํฌ
- ํํฐ ๊ธฐ๋ฐ ์ํคํ ์ฒ๋ก ๋์ํ๋ค.
- ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ผ๋ จ์ ๋ณด์ ํํฐ๋ค๋ก ๊ตฌ์ฑ๋ ํํฐ ์ฒด์ธ(Filter Chain)์ ์์ฐจ์ ์ผ๋ก ํต๊ณผํ๋ฉฐ ์ฒ๋ฆฌ
- ์ด๋ฌํ ํํฐ๋ค์ ์์ฒญ์ด ์ต์ข ๋ชฉ์ ์ง์ธ ์ปจํธ๋กค๋ฌ์ ๋๋ฌํ๊ธฐ ์ ์ ์ธ์ฆ ๋ฐ ์ธ๊ฐ์ ๊ด๋ จ๋ ๋ค์ํ ๋ณด์ ์์ ์ ์ํ
Filter & Interceptor
- Spring Security๋ Spring MVC์ Dispatcher Servlet ๋ณด๋ค ์์ธ Servlet Container ๋ด๋ถ์ ์กด์ฌํ๋ Filter์์ ์์ํ๋ค.
- ํด๋ผ์ด์ธํธ๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ์์ฒญ์ ๋ณด๋ด๋ฉด ์ปจํ ์ด๋๋ ์์ฒญ URI ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ HttpSevletRequest๋ฅผ ์ฒ๋ฆฌํด์ผ ํ๋ ํํฐ ์ธ์คํด์ค์ ์๋ธ๋ฆฟ์ ํฌํจํ๋ FtilerChain์ ์์ฑํ๋ค.
Filter
HTTP ์์ฒญ โ WAS โ ํํฐ โ ์๋ธ๋ฆฟ( DispatcherServlet ) โ Controller
Filter๋
- ๋ค์ด ์คํธ๋ฆผ ํํฐ ์ธ์คํด์ค(Downstream Filter Instance) ๋๋ ์๋ธ๋ฆฟ์ด ํธ์ถ๋์ง ์๋๋ก ํ๋ค. ์ด ๊ฒฝ์ฐ ํํฐ๋ ์ผ๋ฐ์ ์ผ๋ก HttpServletResponse๋ฅผ ์์ฑํ๋ค.
- ๋ค์ด ์คํธ๋ฆผ ํํฐ ์ธ์คํด์ค ๋ฐ ์๋ธ๋ฆฟ์์ ์ฌ์ฉํ๋ HttpServletRequest ๋๋ HttpServletResponse๋ฅผ ์์ ํ๋ค.
=> Filter๋ DispatcherServlet์ผ๋ก ๊ฐ๊ธฐ ์ ์ ํธ์ถ๋๋ฉฐ, ํํฐ๊ฐ ์ ์ ํ์ง ๋ชปํ ์์ฒญ์ด๋ผ๊ณ ํ๋จํ๋ฉด ์๋ธ๋ฆฟ ํธ์ถ X
ํํฐ๋ ๋ค์ด ์คํธ๋ฆผ ํํฐ ์ธ์คํด์ค์ ์๋ธ๋ฆฟ์๋ง ์ํฅ์ ๋ฏธ์น๋ฏ๋ก ๊ฐ ํํฐ๊ฐ ํธ์ถ๋๋ ์์๋ ๋งค์ฐ ์ค์
Interceptor
HTTP ์์ฒญ โ WAS โ ํํฐ โ ์๋ธ๋ฆฟ โ ์คํ๋ง ์ธํฐ์ ํฐ โ Controller
Intercepter๋ Spring์ด ์ ๊ณตํ๋ ๊ธฐ์ ์ด๊ณ , Spring MVC์ ์์์ ์ด DispatcherServlet ์ด๊ธฐ ๋๋ฌธ์ ์๋ธ๋ฆฟ ๋ค์์ ํธ์ถ
์ธ์ฆ (Authentication)
- ํด๋น ์ฌ์ฉ์๊ฐ ๋ณธ์ธ์ธ์ง ํ์ธํ๋ ์ ์ฐจ
- ์์ฒญ์ ๋ณด๋ธ ์ ๊ทผ ์ฃผ์ฒด๊ฐ ๋๊ตฌ์ธ์ง, ์ฆ ์ฌ์ฉ์์ ์ง๋ณธ์ฑ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ ๊ฒ
- ์ฌ์ฉ์๋ ์ฃผ๋ก ๋น๋ฐ๋ฒํธ์ ๊ฐ์ ์๊ฒฉ ์ฆ๋ช ์ ์ ๊ณต
- Spring Security๋principal(์ธ์ฆ ์์ฒญ ์ฃผ์ฒด) - credential(์ฆ๋ช ) ํจํด์ผ๋ก ๊ตฌ์ฑ
์ธ๊ฐ (Authorization)
- ์ธ์ฆ๋ ์ฌ์ฉ์๊ฐ ์์ฒญํ ์์(๋ฆฌ์์ค)์ ์ ๊ทผ ๊ฐ๋ฅํ์ง ๊ฒฐ์ ํ๋ ์ ์ฐจ
- ์ฌ์ฉ์์ ์ ์์ด ์ฆ๋ช ๋ ์ดํ ํด๋น ์ฌ์ฉ์๊ฐ ํน์ ๋์์ด๋ ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ด ์๋์ง ํ์ธํ๋ ๊ณผ์
- ์น ์์ฒญ ๊ถํ, ๋ฉ์๋ ํธ์ถ ๋ฐ ๋๋ฉ์ธ ์ธ์คํด์ค์ ๋ํ ์ ๊ทผ ๊ถํ ๋ถ์ฌ ์์ญ์ด ์์
Spring Security์ ๊ตฌ์ฑ ์์
[ ํํฐ ์ฒด์ธ (Filter Chain) ]
- ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฌ๋ฌ ๋ณด์ ํํฐ๋ก ๊ตฌ์ฑ๋ ์ฒด์ธ์ ์์๋๋ก ํต๊ณผํ๋ฉฐ ์ฒ๋ฆฌ
- ๊ฐ ํํฐ๋ ํน์ ๋ณด์ ์์ ์ ๋ด๋นํ๋ฉฐ, ์์ฒญ์ด ์ต์ข ๋ชฉ์ ์ง์ ๋๋ฌํ๊ธฐ ์ ์ ์ธ์ฆ ๋ฐ ์ธ๊ฐ ๊ด๋ จ ์ฒ๋ฆฌ๋ฅผ ์ํ
- ์คํ๋ง ์ํ๋ฆฌํฐ์ ํํฐ ์ฒด์ธ์ ๋ค์ค์ผ๋ก ์ค์ ํ์ฌ URL ํจํด๋ณ๋ก ๋ณ๋ ๊ตฌ์ฑ์ด ๊ฐ๋ฅ
[ Authentication ๊ฐ์ฒด ]
- ์ธ์ฆ ์ ์ฐจ๋ ์ฌ์ฉ์๊ฐ ๋๊ธด ์ด ๊ฐ์ฒด๋ฅผ ํตํด ์งํ๋๋ฉฐ, ์ธ์ฆ ์์ฒญ ์ ๋ณด(์: ์์ด๋/ํจ์ค์๋)๋ฅผ ๋ด๊ณ ์์
- ์ธ์ฆ ์ ์ฐจ ์ ๋ฐ์ ๊ฑธ์ณ ์ฐธ์กฐ๋๊ณ ์์ ๋๋ฉฐ, ์ธ์ฆ ์ฑ๊ณต ์ ๊ฒฐ๊ณผ Authentication ๊ฐ์ฒด๊ฐ ๋ฐํ
- Principal(์ธ์ฆ๋ ์ฌ์ฉ์), Credentials(์๊ฒฉ ์ฆ๋ช ), Authorities(๊ถํ ๋ชฉ๋ก), Authenticated status(์ธ์ฆ ์ฌ๋ถ) ๋ฑ์ ์ ๋ณด๋ฅผ ํฌํจ
[ AuthenticationManager ]
- ์คํ๋ง ์ํ๋ฆฌํฐ ์ธ์ฆ ์ ์ฐจ์ ์ค์ถ
- ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ ์ธ์ฆ์ฉ ๊ฐ์ฒด(Authentication)๋ฅผ ๊ฐ์ง๊ณ ์ธ์ฆ ์ฒ๋ฆฌ๋ฅผ ์์
- ๋ฑ๋ก๋ ์ฌ๋ฌ ๊ฐ์ AuthenticationProvider๋ฅผ ๊ฐ์ง๊ณ ์ธ์ฆ์ ์๋(authenticate() ๋ฉ์๋๋ฅผ ํตํด ์ธ์ฆ์ ์ํ)
- ์ฃผ๋ก ProviderManager๋ฅผ ์ฌ์ฉ
[ ProviderManager ]
- AuthenticationManager์ ์ผ๋ฐ์ ์ธ ๊ตฌํ์ฒด
- ์์ ์ด ๊ฐ์ง AuthenticationProvider๋ค์ ์ํํ๋ฉฐ ์ธ์ฆ์ ์๋
- ๋ค๋ฅธ AuthenticationManager๋ฅผ ๋ถ๋ชจ๋ก ๊ฐ์ง ์ ์์ด ์์ ์ด ์ฒ๋ฆฌํ ์ ์๋ ์ธ์ฆ ์์ฒญ์ ๋ถ๋ชจ์๊ฒ ์์
[ AuthenticationProvider ]
- ์ค์ ๋ก ์ธ์ฆ์ ์ํํ๋ ์ฃผ์ฒด
- ์ ๋ฌ๋ฐ์ Authentication ๊ฐ์ฒด๋ฅผ ์ฒ๋ฆฌ ๊ฐ๋ฅํ์ง supports() ๋ฉ์๋๋ก ํ์ธ, ์ฒ๋ฆฌ ๊ฐ๋ฅํ๋ค๋ฉด authenticate() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์ธ์ฆ์ ์๋
- ์ธ์ฆ์ ์ฑ๊ณตํ๋ฉด ๊ฒฐ๊ณผ Authentication ๊ฐ์ฒด๋ฅผ ๋ฐํ, ์คํจํ๋ฉด AuthenticationException์ ๋ฐ์
- ํด๋น Provider๊ฐ ํธ๋ค๋งํ ์ ์๋ค๋ฉด ๋ค์ Provider๊ฐ ์ด๋ฅผ ์ํ
[ UserDetailsService ]
- AuthenticationProvider๊ฐ ์ฌ์ฉ์์ ์์ธ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด ์ฌ์ฉํ๋ ์ธํฐํ์ด์ค
- ์ฌ์ฉ์ ์ด๋ฆ(username)์ ์ธ์๋ก ๋ฐ์ DB ๋ฑ์์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์กฐํํ์ฌ UserDetails ํ์ ์ผ๋ก ๋ฐํ
[ UserDetails ]
- ์ฌ์ฉ์์ ์์ธ ์ ๋ณด(๋น๋ฐ๋ฒํธ, ๊ถํ ๋ฑ)๋ฅผ ๋ด๋ ์ธํฐํ์ด์ค๋ก, ๊ฐ๋ฐ์๊ฐ ์ง์ ์์๋ฐ์ ์ฌ์ฉ ๊ฐ๋ฅ
- ํ๋ก์ ํธ์ ํ์ ์ ๋ณด์ ๊ดํ ๋ค๋ฅธ ์ ๋ณด(์ด๋ฉ์ผ, ๋์ด, ์ฃผ์ ๋ฑ)๋ฅผ ์ถ๊ฐํ์ฌ ์ฌ์ฉ ๊ฐ๋ฅ
[ SecurityContextHolder ]
- ์ธ์ฆ์ ์ฑ๊ณตํ์ฌ ์ป์ Authentication ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๊ณ ์ ๊ณตํ๋ Spring Security์ ํต์ฌ
- ํ์ฌ ์ธ์ฆ๋ ์ฌ์ฉ์์ ๊ด๋ จ๋ ๋ณด์ ์ ๋ณด๋ฅผ ์ ์ฅ
- ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ฌ ์ค๋ ๋์์ SecurityContext ๊ฐ์ฒด๋ฅผ ์ ์งํ์ฌ ์ธ์ฆ ์ ๋ณด์ ์ ๊ทผ ๊ฐ๋ฅ ํ๋๋ก ํจ
- SecurityContext: ํ์ฌ ์ธ์ฆ๋ ์ฌ์ฉ์์ ๊ด๋ จ๋ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ผ๋ฉฐ Authentication ๊ฐ์ฒด๋ฅผ ํฌํจ
[ ThreadLocal ]
- SecurityContextHolder๋ ๊ธฐ๋ณธ์ ์ผ๋ก ThreadLocal์ ์ฌ์ฉํ์ฌ ํ์ฌ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ์ค๋ ๋์ ๋ฉ๋ชจ๋ฆฌ์ SecurityContext ๊ฐ์ฒด๋ฅผ ์ ์ฅ
- ์์ฒญ๋ณ ๋ ๋ฆฝ์ฑ์ ๋ณด์ฅ, ์ค๋ ๋ ํ ์ฌ์ฉ ์ ์ด์ ์์ฒญ ์ ๋ณด๊ฐ ๋จ์ ์๋ ๊ฒ์ ๋ฐฉ์ง
- ์์ฒญ์ด ๋๋๋ฉด ๋ฉ๋ชจ๋ฆฌ์์ ์๋์ผ๋ก ์ ๊ฑฐ
[ ์ธ๊ฐ ๊ตฌํ ]
- ์ธ๊ฐ๋ ์ฃผ๋ก FilterSecurityInterceptor๋ AuthorizationFilter์ ๊ฐ์ ํํฐ์ ์ํด ์ฒ๋ฆฌ
- SecurityContextHolder์ ์ ์ฅ๋ ์ธ์ฆ๋ ์ฌ์ฉ์ ์ ๋ณด(Authentication ๊ฐ์ฒด)์ ๋ฆฌ์์ค์ ์ ์๋ ๋ณด์ ๊ท์น์ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉ์๊ฐ ํด๋น ๋ฆฌ์์ค์ ์ ๊ทผํ ๊ถํ์ด ์๋์ง ํ์ธ
Spring Security์ ์ฃผ์ ํ๋ฆ
Spring Security๋ Servlet Filter ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ฉฐ, HTTP ์์ฒญ์ด ์น ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ๋ค์ด์ฌ ๋๋ถํฐ ์๋ต์ด ๋๊ฐ ๋๊น์ง ๋ค์ํ ๋ณด์ ๊ฒ์ฌ๋ฅผ ์ํํ๋ค. ์ด ๋ชจ๋ ๊ณผ์ ์ FilterChainProxy๋ผ๋ ํต์ฌ ์ปดํฌ๋ํธ๊ฐ ๊ด๋ฆฌํ๋ ์ฌ๋ฌ SecurityFilterChain์ ์ํด ์ด๋ฃจ์ด์ง๋ค.
1. ์์ฒญ ์์ ๋ฐ ์ง์ ์ (DelegatingFilterProxy & FilterChainProxy)
- HTTP ์์ฒญ ์์ : ์ฌ์ฉ์์ ์น ๋ธ๋ผ์ฐ์ ๋ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ HTTP ์์ฒญ(์: GET /home, POST /login)์ด ์๋ธ๋ฆฟ ์ปจํ ์ด๋(Tomcat, Jetty ๋ฑ)๋ก ๋ค์ด์ด
- DelegatingFilterProxy: ๋ชจ๋ HTTP ์์ฒญ์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์ํด ๊ฐ์ฅ ๋จผ์ DelegatingFilterProxy๋ก ์ ๋ฌ (์ด ํ๋ก์ ํํฐ๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ Spring ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ๋ฅผ ์ฐ๊ฒฐํ๋ ๋ค๋ฆฌ ์ญํ ).
- FilterChainProxy๋ก ์์: DelegatingFilterProxy๋ ์ค์ Spring ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ์ Bean์ผ๋ก ๋ฑ๋ก๋ FilterChainProxy์๊ฒ ์์ฒญ ์ฒ๋ฆฌ๋ฅผ ์์
- FilterChainProxy์ ์ญํ
- FilterChainProxy๋ ๋ค์ด์จ HTTP ์์ฒญ์ URL ํจํด์ ๊ธฐ๋ฐ์ผ๋ก, ๋ฏธ๋ฆฌ ์ค์ ๋ ์ฌ๋ฌ SecurityFilterChain ์ค์์ ๊ฐ์ฅ ๋จผ์ ๋งค์นญ๋๋ SecurityFilterChain ํ๋๋ฅผ ์ ํ
- ๊ฐ SecurityFilterChain์ ํน์ ๊ฒฝ๋ก(RequestMatcher)์ ๋ํ ๋ณด์ ๊ท์น๊ณผ ํํฐ๋ค์ ์งํฉ
- ์ด ์์ ์์ ๋ค๋ฅธ SecurityFilterChain๋ค์ ๋ ์ด์ ๊ฒ์ฌ๋์ง ์์
2. ์ ํ๋ SecurityFilterChain ๋ด๋ถ์ ํํฐ ์์ ๋ฐ ์ญํ
์ ํ๋ SecurityFilterChain ๋ด์ ํํฐ๋ค์ ๋ค์๊ณผ ๊ฐ์ ์ผ๋ฐ์ ์ธ ์์๋ก ์คํ๋๋ฉฐ, ๊ฐ ํํฐ๋ ํน์ ๋ณด์ ๊ธฐ๋ฅ์ ๋ด๋น
- DisableEncodeUrlFilter
- URL์ ์ธ์ ID๊ฐ ํฌํจ๋์ด ๋ ธ์ถ๋๋๊ฑธ ๋ฐฉ์งํ๊ธฐ ์ํด URL ์ธ์ฝ๋ฉ์ ๋นํ์ฑํ(์ธ์ ๊ณ ์ ๊ณต๊ฒฉ ๋ฐฉ์ง)
- ForceEagerSessionCreationFilter
- ์ธ์ ์ด ํ์ํ ๋ ๋ฐ๋ก ์ธ์ ์ ์์ฑํ๋๋ก ๊ฐ์
- ChannelProcessingFilter
- HTTP ์์ฒญ์ ํ๋กํ ์ฝ(HTTP/HTTPS)์ ํ์ธํ๊ณ , ํ์ํ ๊ฒฝ์ฐ ๊ฐ์ ๋ก ์ ํํ๊ฑฐ๋ ์ ๊ทผ์ ์ฐจ๋จ
- ex) ๋ฏผ๊ฐํ ์ ๋ณด ์ ์ก ์ HTTPS๋ฅผ ๊ฐ์
- WebAsyncManagerIntegrationFilter
- ์น์์ ๋น๋๊ธฐ ์์ ์ด ์ํ๋ ๋, ํ์ฌ ์์ฒญ ์ค๋ ๋์ SecurityContext๊ฐ ๋น๋๊ธฐ ์ค๋ ๋์์๋ ์ ์ง๋๋๋ก ํตํฉ
- ๋น๋๊ธฐ ํธ์ถ์์๋ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๊ฐ ์์ค๋์ง ์๋๋ก ๋ณด์ฅ
- SecurityContextHolderFilter (Spring Security 6์ ๊ธฐ๋ณธ, ์ด์ ๋ฒ์ ์ SecurityContextPersistenceFilter)
- SecurityContextHolder์ HTTP ์ธ์
๊ฐ์ SecurityContext ๋๊ธฐํ๋ฅผ ๋ด๋น.
- ์์ฒญ ์์ ์: HTTP ์ธ์ ์์ SecurityContext๋ฅผ ์กฐํํ์ฌ SecurityContextHolder (๊ธฐ๋ณธ์ ์ผ๋ก ThreadLocal ์ฌ์ฉ)์ ์ค์ , ๋ง์ฝ ์ธ์ ์ ์์ผ๋ฉด ์๋ก์ด SecurityContext๋ฅผ ์์ฑ
- ์์ฒญ ์๋ฃ ์: SecurityContextHolder์ ์๋ SecurityContext๋ฅผ HTTP ์ธ์ ์ ์ ์ฅํ๊ฑฐ๋ ์ ๋ฐ์ดํธ, SecurityContextHolder๋ฅผ ์ด๊ธฐํ(๋ค์ ์์ฒญ์ ์ํฅ์ ์ฃผ์ง ์๋๋ก ํ๊ธฐ ์ํด)
- ์ดํ ์ฒ๋ฆฌ: SecurityContextHolder์ ์ ์ฅ๋ ์ธ์ฆ ์ ๋ณด๋ ์ดํ ์ธ๊ฐ ์ ์ฐจ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น์ฆ๋์ค ๋ก์ง์์ ํ์ฌ ์ธ์ฆ๋ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ ํ์ฉํ๋ ๋ฐ ์ฌ์ฉ
- SecurityContextHolder์ HTTP ์ธ์
๊ฐ์ SecurityContext ๋๊ธฐํ๋ฅผ ๋ด๋น.
- HeaderWriterFilter
- HTTP ์๋ต ํค๋์ ๋ณด์ ๊ด๋ จ ์ ๋ณด๋ฅผ ์ถ๊ฐ
- ex) X-Frame-Options (ํด๋ฆญ์ฌํน ๋ฐฉ์ง), X-Content-Type-Options (MIME ์ค๋ํ ๋ฐฉ์ง), HSTS (HTTP Strict Transport Security) ๋ฑ์ ํค๋๋ฅผ ์ค์
- CsrfFilter
- CSRF(Cross-Site Request Forgery) ๊ณต๊ฒฉ์ ๋ฐฉ์ด
- POST, PUT, DELETE์ ๊ฐ์ ์ํ ๋ณ๊ฒฝ ์์ฒญ์ ๋ํด CSRF ํ ํฐ ์ ํจ์ฑ์ ๊ฒ์ฆ
- LogoutFilter
- ๋ฏธ๋ฆฌ ์ค์ ๋ ๋ก๊ทธ์์ ์์ฒญ URL(์: /logout)์ ๊ฐ์
- ์์ฒญ์ด ํด๋น URL๋ก ๋ค์ด์ค๋ฉด ์ฌ์ฉ์์ ์ธ์ ์ ๋ฌดํจํํ๊ณ , SecurityContext๋ฅผ ์ด๊ธฐํํ๋ฉฐ, ํ์ํ ๊ฒฝ์ฐ ์ฟ ํค๋ฅผ ์ญ์ ํ๋ ๋ฑ ๋ก๊ทธ์์ ์ฒ๋ฆฌ๋ฅผ ์ํ
- ์ธ์ฆ ๊ด๋ จ ํํฐ (Authentication Filters)
- UsernamePasswordAuthenticationFilter
- ํผ ๊ธฐ๋ฐ ๋ก๊ทธ์ธ(์ฌ์ฉ์ ์ด๋ฆ๊ณผ ๋น๋ฐ๋ฒํธ) ์์ฒญ์ ์ฒ๋ฆฌ
- ์ค์ ๋ ๋ก๊ทธ์ธ URL(๊ธฐ๋ณธ /login)๋ก POST ์์ฒญ์ด ์ค๋ฉด, ์์ฒญ์์ ์ฌ์ฉ์ ์ด๋ฆ๊ณผ ๋น๋ฐ๋ฒํธ๋ฅผ ์ถ์ถํ์ฌ UsernamePasswordAuthenticationToken๊ณผ ๊ฐ์ Authentication ๊ฐ์ฒด๋ฅผ ์์ฑ
- BasicAuthenticationFilter
- HTTP Authorization ํค๋์ ๋ด๊ธด Base64 ์ธ์ฝ๋ฉ ๋ ์ฌ์ฉ์ ์ด๋ฆ๊ณผ ๋น๋ฐ๋ฒํธ๋ฅผ ์ถ์ถํ์ฌ ๊ธฐ๋ณธ ์ธ์ฆ(Basic Authentication)์ ์ฒ๋ฆฌ
- OAuth2LoginAuthenticationFilter / Saml2WebSsoAuthenticationFilter / JwtAuthenticationConverter ๊ด๋ จ ํํฐ ๋ฑ
- ๊ฐ๊ฐ OAuth 2.0/OpenID Connect, SAML 2.0 SSO, JWT(JSON Web Token) ๋ฑ ๋ค์ํ ์ธ์ฆ ๋ฐฉ์์ ์ฒ๋ฆฌํ๋ ํํฐ
- ์ด๋ค๋ ์์ ์ ๋ฐฉ์์ ๋ง๋ Authentication ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ AuthenticationManager์๊ฒ ์ธ์ฆ์ ์์
- UsernamePasswordAuthenticationFilter
- RememberMeAuthenticationFilter
- "Remember Me" ๊ธฐ๋ฅ์ ๊ตฌํ(์ฌ์ฉ์๊ฐ ๋ธ๋ผ์ฐ์ ๋ฅผ ๋ซ๊ณ ๋ค์ ์ด์ด๋ ๋ก๊ทธ์ธ ์ํ๊ฐ ์ ์ง)
- ์ธ์ ์ด ๋ง๋ฃ๋ ํ์๋ RememberMeServices๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฅ๋ ํ ํฐ์ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉ์๋ฅผ ์๋์ผ๋ก ์ฌ์ธ์ฆ (๊ธฐ๋ณธ ์ ํจ ๊ธฐ๊ฐ 2์ฃผ)
- ConcurrentSessionFilter
- ๋์ผํ ์ฌ์ฉ์ ๊ณ์ ์ผ๋ก ์ฌ๋ฌ ์ธ์ ์์ ๋์์ ๋ก๊ทธ์ธํ๋ ๊ฒ์ ์ ์ดํ๋ ๋์ ์ธ์ ์ ์ด๋ฅผ ๋ด๋น
- ํน์ ์ธ์ ์ ๋ง๋ฃ์ํค๊ฑฐ๋ ์๋ก์ด ๋ก๊ทธ์ธ์ ๊ฑฐ๋ถํ ์ ์์
- RequestCacheFilter
- ์ธ์ฆ์ด ํ์ํ ๋ฆฌ์์ค์ ์ ๊ทผํ๋ ค ํ์ผ๋ ์์ง ๋ก๊ทธ์ธ๋์ง ์์ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธ๋ ๊ฒฝ์ฐ, ์๋ ์ ๊ทผํ๋ ค๋ ์์ฒญ ์ ๋ณด๋ฅผ ์บ์์ ์ ์ฅ
- ๋ก๊ทธ์ธ ์ฑ๊ณต ํ ํด๋น ์บ์๋ ์์ฒญ์ผ๋ก ๋ค์ ๋ฆฌ๋ค์ด๋ ํธํ์ฌ UX์ ํฅ์
- ServletApiRequestFilter
- ์๋ธ๋ฆฟ API์ HttpServletRequest์ ๋ณด์ ๊ด๋ จ ๋ฉ์๋(์: isUserInRole(), getUserPrincipal())๋ฅผ ํตํฉ
- SecurityContextHolder์ ์ ์ฅ๋ ์ธ์ฆ ์ ๋ณด๋ฅผ ํ์ฉ
- AnonymousAuthenticationFilter
- SecurityContextHolder์ ์ธ์ฆ ์ ๋ณด๊ฐ ์๋ ์ฌ์ฉ์์๊ฒ ์์๋ก "์ต๋ช " ์ฌ์ฉ์ (AnonymousAuthenticationToken)๋ฅผ ํ ๋น
- ์ธ์ฆ๋์ง ์์ ์ฌ์ฉ์๋ ํน์ ๋ฆฌ์์ค์ ๋ํด ์ต์ํ์ ์ ๊ทผ ๊ถํ์ ๊ฐ์ง๋๋ก ํจ
(๊ธฐ๋ณธ name: anonymousUser, role: ROLE_ANONYMOUS)
- SessionManagementFilter
- ์ธ์ฆ๋ ์ฌ์ฉ์์ ์ธ์ ๊ณผ ๊ด๋ จ๋ ์ ๋ฐ์ ์ธ ๊ด๋ฆฌ๋ฅผ ์ํ
- ์๋ก์ด ์ธ์ ID ๋ถ์ฌ, ์ ํจํ์ง ์์ ์ธ์ ์ฒ๋ฆฌ, ์ธ์ ํ์์์, ๋์์ฑ ์ ์ด ๋ฑ์ ์ ์ฑ ์ ์ํ
- ExceptionTranslationFilter
- ํํฐ ์ฒด์ธ์์ ๋ฐ์ํ๋ AuthenticationException(์ธ์ฆ ์คํจ) ๋๋ AccessDeniedException(์ธ๊ฐ ์คํจ) ์์ธ๋ฅผ ์บ์นํ์ฌ ์ ์ ํ ์ฒ๋ฆฌ
- AuthenticationException ๋ฐ์ ์: AuthenticationEntryPoint๋ฅผ ํธ์ถ, ์ผ๋ฐ์ ์ผ๋ก ๋ก๊ทธ์ธ ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธ ํ๊ฑฐ๋ WWW-Authenticate ํค๋๋ฅผ ํฌํจํ 401 Unauthorized ์๋ต์ ๋ฐํ
- AccessDeniedException ๋ฐ์ ์: AccessDeniedHandler๋ฅผ ํธ์ถ, ์ผ๋ฐ์ ์ผ๋ก 403 Forbidden ์๋ต์ ๋ฐํํ๊ฑฐ๋ ์ ๊ทผ ๊ฑฐ๋ถ ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธ
- ํํฐ ์ฒด์ธ์์ ๋ฐ์ํ๋ AuthenticationException(์ธ์ฆ ์คํจ) ๋๋ AccessDeniedException(์ธ๊ฐ ์คํจ) ์์ธ๋ฅผ ์บ์นํ์ฌ ์ ์ ํ ์ฒ๋ฆฌ
- AuthorizationFilter (Spring Security 6์ ๊ธฐ๋ณธ ๊ถํ ๋ถ์ฌ ํํฐ)
- ํํฐ ์ฒด์ธ์ ๊ฐ์ฅ ๋ง์ง๋ง์ ์์นํ์ฌ, ์ค์ ๋ฆฌ์์ค(URL, ๋ฉ์๋ ๋ฑ)์ ๋ํ ๊ถํ ๋ถ์ฌ(Authorization)๋ฅผ ๋ด๋น
- SecurityContextHolder์ ์ ์ฅ๋ Authentication ๊ฐ์ฒด(์ธ์ฆ๋ ์ฌ์ฉ์ ์ ๋ณด)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก AuthorizationManager๋ฅผ ํธ์ถํ์ฌ ํ์ฌ ์ฌ์ฉ์๊ฐ ์์ฒญ๋ ๋ฆฌ์์ค์ ์ ๊ทผํ ๊ถํ์ด ์๋์ง ์ต์ข ์ ์ผ๋ก ํ์ธ
3. ์๋ต ๋ฐํ
- ๋ชจ๋ ํํฐ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋๊ณ , ํ์ํ ๊ฒฝ์ฐ AuthorizationFilter๋ฅผ ํตํด ๊ถํ๊น์ง ๋ถ์ฌ๋์๋ค๋ฉด, HTTP ์์ฒญ์ ์ต์ข ์ ์ผ๋ก ์ปจํธ๋กค๋ฌ๋ REST ์๋ํฌ์ธํธ๋ก ์ ๋ฌ๋์ด ๋น์ฆ๋์ค ๋ก์ง์ ์ํ
- ๋น์ฆ๋์ค ๋ก์ง ์ฒ๋ฆฌ ํ ์์ฑ๋ ์๋ต์ ํํฐ ์ฒด์ธ์ ์ญ์์ผ๋ก ๋ค์ ๊ฑฐ์น๋ฉฐ, ๊ฐ ํํฐ๋ ์๋ต ํค๋ ์ถ๊ฐ
- (HeaderWriterFilter), ์ธ์ ์ ๋ฆฌ(SecurityContextHolderFilter) ๋ฑ์ ์์ ์ ์ํํ ํ ํด๋ผ์ด์ธํธ์๊ฒ ์ต์ข ์ ์ผ๋ก ์ ๋ฌ
์ธ์ฆ ๊ณผ์ (Form Login ์์)
- ์์ฒญ ์์ : ์ฌ์ฉ์์ ๋ก๊ทธ์ธ ์ ๋ณด(์์ด๋, ๋น๋ฐ๋ฒํธ ๋ฑ)๊ฐ ๋ด๊ธด HTTP ์์ฒญ์ ์์
- ํํฐ์ ์ํ ์์ฒญ ๊ฐ๋ก์ฑ: AuthenticationFilter๊ฐ ์ด ์์ฒญ์ ๊ฐ๋ก์ฑ
- Authentication ๊ฐ์ฒด ์์ฑ: ์์ฒญ์ผ๋ก๋ถํฐ ์ฌ์ฉ์์ ์๊ฒฉ ์ฆ๋ช
์ ๋ณด๋ฅผ ์ถ์ถํ์ฌ ์ธ์ฆ์ฉ ๊ฐ์ฒด(Authentication)๋ฅผ ์์ฑ(UsernamePasswordAuthenticationToken์ ์ธ์ฆ์ฉ ๊ฐ์ฒด๋ฅผ ์์ฑ)
- AuthenticationManager์๊ฒ ์์: ์์ฑ๋ Authentication ๊ฐ์ฒด๋ AuthenticationManager์๊ฒ ์ ๋ฌ๋์ด ์ธ์ฆ ์ฒ๋ฆฌ๊ฐ ์์ (ProviderManager๋ ์ด ๊ฐ์ฒด๋ฅผ ์ธ์๋ก ๋ฐ์ ์ธ์ฆ ์ ์ฐจ๋ฅผ ์์)
- AuthenticationProvider ์ ํ ๋ฐ ์ธ์ฆ ์๋: AuthenticationManager๋ ์์ ์ด ๊ฐ์ง ์ฌ๋ฌ AuthenticationProvider๋ค ์ค ํด๋น Authentication ๊ฐ์ฒด๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ Provider๋ฅผ ์ฐพ์ ์ธ์ฆ ์ฒ๋ฆฌ๋ฅผ ๋ค์ ์์
- UserDetailsService๋ฅผ ํตํ ์ฌ์ฉ์ ์ ๋ณด ์กฐํ: ์ ํ๋ AuthenticationProvider๋ UserDetailsService๋ฅผ ํตํด ์ฌ์ฉ์์ username์ ๊ธฐ๋ฐ์ผ๋ก DB ๋ฑ์์ ์ฌ์ฉ์ ์์ธ ์ ๋ณด(UserDetails)๋ฅผ ์กฐํ
- ์๊ฒฉ ์ฆ๋ช
๋น๊ต ๋ฐ ์ธ์ฆ ์ํ: AuthenticationProvider๋ ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ธ ์๊ฒฉ ์ฆ๋ช
๊ณผ UserDetails์ ์ ๋ณด๋ฅผ ๋น๊ต
- ์ธ์ฆ ์ฑ๊ณต/์คํจ ์ฒ๋ฆฌ
- ์ฑ๊ณต: ์ธ์ฆ์ ์ฑ๊ณตํ๋ฉด AuthenticationProvider๋ ์ธ์ฆ๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ด์ Authentication ๊ฐ์ฒด๋ฅผ ๋ฐํ
- ์ด ๊ฐ์ฒด๋ ProviderManager๋ฅผ ๊ฑฐ์ณ ์ต์ข ์ ์ผ๋ก ์ฑ๊ณต ๊ฒฐ๊ณผ๋ก ์ฒ๋ฆฌ
- ์คํจ: ์ธ์ฆ์ ์คํจํ๋ฉด AuthenticationProvider๋ AuthenticationException์ ๋ฐ์, ProviderManager๋ฅผ ๊ฑฐ์ณ ์์ธ ์ฒ๋ฆฌ
- ExceptionTranslationFilter๊ฐ ์ด๋ฌํ ์์ธ๋ฅผ ์ฒ๋ฆฌํ์ฌ ๋ก๊ทธ์ธ ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธํ๋ ๋ฑ์ ์ ์ ํ ์๋ต์ ๋ฐํ
- ๋ง์ฝ ๋ชจ๋ Provider๊ฐ ํธ๋ค๋ง์ ์คํจํ๊ฑฐ๋ ์ฒ๋ฆฌํ ์ ์๋ ๊ฒฝ์ฐ, ProviderNotFoundException์ด ๋ฐ์
- ์ฑ๊ณต: ์ธ์ฆ์ ์ฑ๊ณตํ๋ฉด AuthenticationProvider๋ ์ธ์ฆ๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ด์ Authentication ๊ฐ์ฒด๋ฅผ ๋ฐํ
- SecurityContextHolder์ ์ ์ฅ: ์ธ์ฆ์ด ์๋ฃ๋๋ฉด ๊ฒฐ๊ณผ๋ก ๋ฐํ๋ Authentication ๊ฐ์ฒด๋ SecurityContextHolder์ ์ ์ฅ SecurityContextHolder๋ ๊ธฐ๋ณธ์ ์ผ๋ก ThreadLocal์ ์ฌ์ฉํ์ฌ ํ์ฌ ์์ฒญ ์ค๋ ๋์ SecurityContext์ ์ด ์ ๋ณด๋ฅผ ์ถ๊ฐ
- ์ดํ ์ฒ๋ฆฌ: SecurityContextHolder์ ์ ์ฅ๋ ์ธ์ฆ ์ ๋ณด๋ ์ดํ ์ธ๊ฐ ์ ์ฐจ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น์ฆ๋์ค ๋ก์ง์์ ํ์ฌ ์ธ์ฆ๋ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ ํ์ฉํ๋ ๋ฐ ์ฌ์ฉ