[Spring Boot] Spring Security Basic - Spring Security ์ฃผ์ ์ํคํ์ณ ์ดํดํ๊ธฐ
์ด ๊ธ์ ์ธํ๋ฐ - Spring Boot ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๋ฐํ๋ Spring Security๋ฅผ ํ์ตํ๋ฉด์ ์ ๋ฆฌํ ๋ด์ฉ ์ ๋๋ค.
GIT HUB ์ฃผ์ : https://github.com/junyharang-coding-study/spring-security
๐ ๋ชฉ์ฐจ
โ [Spring Boot] Spring Security Basic - ๊ธฐ๋ณธ API ๋ฐ Filter ์ดํดํธ
โ [Stpring Boot] Spring Security Basic - Spring Security ์ฃผ์ ์ํคํ
์ฒ ์ดํดํธ
โ [Stpring Boot] Spring Security ์ค์ ํ๋ก์ ํธ - ์ธ์ฆ ํ๋ก์ธ์ค Form ์ธ์ฆ ๊ตฌํ(1)
โ [Stpring Boot] Spring Security ์ค์ ํ๋ก์ ํธ - ์ธ์ฆ ํ๋ก์ธ์ค Form ์ธ์ฆ ๊ตฌํ(2)
โ [Stpring Boot] Spring Security ์ค์ ํ๋ก์ ํธ - ์ธ์ฆ ํ๋ก์ธ์ค Ajax ์ธ์ฆ ๊ตฌํ
๐ Spring Security ์ฃผ์ ์ํคํ ์ฒ
๐ฝ ์์ ํํฐ ๋ฐ ํํฐ Bean ์ด๊ธฐํ
๐ฆ DelegationProxyChain
1. Servlet Filter๋ Spring์์ ์ ์๋ Bean์ ์ฃผ์
ํด์ ์ฌ์ฉ ๋ถ๊ฐ.
2. ํน์ ์ด๋ฆ์ ๊ฐ์ง Spring Bean์ ์ฐพ์ ํด๋น Bean์๊ฒ ์์ฒญ ์์ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅ.
• springSecurityFilterChain ์ด๋ฆ์ผ๋ก ์์ฑ๋ Bean์ ApplicationContext์์ ์ฐพ์ ์์ฒญ ์์.
• ์ค์ ๋ณด์์ฒ๋ฆฌ๋ ํ์ง ์์. ์์ฒญ์ ์์ํ๋ ์ญํ ๋ง ์ํ.
Servlet Filter๋ Servlet Spac์ ์ ์๋ ๊ธฐ์ ๋ก 2.3 Vesion๋ถํฐ ๋์
์ด ๋์์ต๋๋ค.
์ด ์น๊ตฌ๋ ์ด๋ค ์์ฒญ์ด ๋ค์ด์์ ๋, Servlet์ด ์์ฒญ์ ๋ํ ์์
์ ์ฒ๋ฆฌํ๊ฒ ๋๋๋ฐ, Servlet์ ๊ฐ๊ธฐ์ ์ ์ด ์น๊ตฌ์๊ฒ ํด๋น ์์ฒญ์ด ๋จผ์ ๋ค์ด์ค๊ฒ ๋ฉ๋๋ค. ์ด๋ค ์์ฒญ์ด ์์ ๋, ์ฒ๋ฆฌํ๊ณ , ์ฒ๋ฆฌ๋ ๋ด์ฉ์ Servlet์๊ฒ ์ ๋ฌํด ์ฃผ๊ฒ ๋ฉ๋๋ค.
Servlet์์ ์์ฒญ ์ฒ๋ฆฌ ์์
์ด ๋ค ๋๋๊ฒ ๋๋ฉด ์ต์ข
์ ์ผ๋ก Client์๊ฒ ์๋ต๊ฐ์ด ์ ๋ฌ๋๊ฒ ๋ฉ๋๋ค. ์ด ์๋ต๊ฐ์ ์ ๋ฌํ๊ธฐ ์ ์ Servlet Filter๊ฐ ๋ค์ ์ฒ๋ฆฌ๋ ๋ด์ฉ์ ๋ฐ์ ๋ ๋ค๋ฅธ ์์
์ ์ฒ๋ฆฌํด์ผ ํ ์ ์์
์ ์ฒ๋ฆฌํ๊ณ , ์๋ต๊ฐ์ ์ต์ข
์ ์ผ๋ก ์ ๋ฌํ๊ฒ ๋ฉ๋๋ค.
Servlet Filter๋ Servlet Container์์ ์์ฑ์ด ๋๊ณ , ์คํ์ด ๋๊ฒ ๋ฉ๋๋ค.
์ด๋ฌํ ์ด์ ๋ก Spring ๊ธฐ์ ์์ ์ฃผ์
๋ฑ์ ํด์ ์ฌ์ฉํ ์๊ฐ ์์ต๋๋ค.
Spring์์๋ ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Spring Bean์ ๋ง๋ค๊ณ , Servlet Filter๋ฅผ ๊ตฌํํ๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ ๊ฒ ๋๋ฉด Bean์ผ๋ก ์์ฑ๋ ๊ฐ์ฒด๋ Filter Type์ ๊ฐ์ฒด๋ฅผ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค.
์ด์ฉ์๊ฐ ์์ฒญ์ ๋ณด๋ด๊ฒ ๋๋ฉด ํ์ฌ๋ Servlet ๊ธฐ๋ฐ์ผ๋ก ์๋ํ๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ์์ฒญ์ Servlet Filter๋ก ์ ๋ฌ๋๊ฒ ๋ฉ๋๋ค.
์ฆ, Spring Bean์ด ๋ฐ๋ก ๋ฐ์ง ๋ชปํ๋ ๋ฌธ์ ๊ฐ ์๊ฒจ ๋ฒ๋ฆฝ๋๋ค. WAS์์ Tomcat์ด ์ฌ๋ผ๊ฐ๊ณ , WAS์์ ์คํ๋ Servlet Filter๊ฐ ์์ฒญ์ ๋ฐ๊ฒ ๋๋ ๊ฒ ์
๋๋ค.
Spring Bean์์ ํด๋น ์์ฒญ์ ๋ฐ๊ฒ ํ๊ธฐ ์ํด์ DelegatingFilterProxy๋ฅผ ์ด์ฉํ ์ ์๋๋ฐ, ์ด Class๋ Servlet Filter์ธ๋ฐ, ์ด์ฉ์ ์์ฒญ์ด Servlet Filter๋ก ๋ค์ด์ค๊ฒ ๋๋ฉด DelegatingFilterProxy๋ ์ด ์์ฒญ์ Spring Bean์์ ๊ด๋ฆฌํ๋ Filter Bean์๊ฒ ์์ํ๋ ์ญํ ์ ํ๊ฒ ๋ฉ๋๋ค.
๐ฆ FilterChainProxy
1. springSecurityFilterChain ์ด๋ฆ์ผ๋ก ์์ฑ๋๋ Filter Bean.
2. DelegatingFilterProxy๋ก ์์ฒญ์ ์์ ๋ฐ๊ณ , ์ค์ ๋ณด์ ์ฒ๋ฆฌ.
3. Spring Security ์ด๊ธฐํ ์ ์์ฑ๋๋ Filter๋ค ๊ด๋ฆฌ ๋ฐ ์ ์ด ์ญํ .
• Spring Security๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ฑํ๋ Filter.
• Config(์ค์ ) Class์์ API ์ถ๊ฐ ์ ์์ฑ๋๋ Filter.
4. ์ด์ฉ์ ์์ฒญ์ Filter ์์๋๋ก ํธ์ถํ์ฌ ์ ๋ฌ.
5. ๊ฐ๋ฐ์ ์ ์ Filter๋ฅผ ์์ฑํ์ฌ ๊ธฐ์กด Filter ์ , ํ๋ก ์ถ๊ฐ ๊ฐ๋ฅ. (Filter ์์๋ฅผ ์ ์ ์ํด์ผ ํจ.)
6. ๋ง์ง๋ง Filter๊น์ง ์ธ์ฆ ๋ฐ ์ธ๊ฐ ์์ธ๊ฐ ๋ฐ์ํ์ง ์์ผ๋ฉด ๋ณด์์ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ํ๋จํ๊ณ , Servlet์ ์ ๋ฌ.
์ด๋ฒ์๋ ์์์ ์ธ๊ธํ ๋๊ฐ์ Proxy์ ๋ํด ์ ์ฒด์ ํ๋ฆ์ ๊ณต๋ถํด ๋ณผ๊ฒ์.
Servelet Container์ Spring Container๋ ์์ ๋ค๋ฅธ ์์ญ์
๋๋ค.
Servelet Container๋ Servelet Spac์ ๊ตฌํํ๋ ์์ญ์ด๊ณ , Spring Container๋ Spring Container์์ ์์ฑ๋๋ Bean๋ค์ ๊ด๋ฆฌํ๋ ์์ญ์ด๋ผ๊ณ ์ ๋ฆฌํ ์ ์์ต๋๋ค.
์ต์ด ์ด์ฉ์๊ฐ ์ฒ์ ์์ฒญ์ ํ๊ฒ ๋๋ฉด Servelet Container๊ฐ ๊ฐ์ฅ ๋จผ์ ์์ฒญ์ ๋ฐ๊ฒ ๋๊ณ , ์์ฒญ์ ๋ํด ๊ฐ๊ฐ์ Servlet Filter๋ค์ด ์์
์ ํ๊ฒ ๋๊ณ , ์ฒ๋ฆฌ ์์
์ค DelegatingFilterProxy๋ ์์ฒญ์ ๋ฐ๊ฒ ๋๋ฉด ํน์ ์ด๋ฆ์ ๊ฐ์ง Bean์ ์ฐพ์ Delegate Request๋ฅผ ๋ณด๋ด๊ฒ ๋๋๋ฐ, ๊ทธ ์ด๋ฆ์ ๊ฐ์ง Bean์ด ๋ฐ๋ก springSecurityFilterChain์ด์์.
๐ก ์ฐธ๊ณ ์ฌํญ
์ค์ ๋ก๋ DelegatingFilterProxy๊ฐ Filter๋ก ๋ฑ๋ก๋ ๋, springSecurityFilterChain์ด๋ฆ์ผ๋ก ๋ฑ๋ก์ด ๋ฉ๋๋ค.
๋ด๋ถ์ ์ผ๋ก๋ springSecurityFilterChain์ด๋ฆ์ผ๋ก ๋ฑ๋ก๋ Filter Chain์ ์ฐพ๊ฒ ๋๋ ๊ฒ์ ๋๋ค.springSecurityFilterChain์ด๋ผ๋ ์ด๋ฆ์ ๊ฐ์ง Bean์ด ๋ฐ๋ก FilterChainProxy์ ๋๋ค.
FilterChainProxy๋ ๋ค์ด์จ ์์ฒญ์ ๋ํด์ ๊ฐ๊ฐ์ Filter๋ค์ ํธ์ถํ์ฌ ์์
์ฆ, ๋ณด์ ์ฒ๋ฆฌ๋ฅผ ํ๊ฒ ๋๊ณ , ๋ณด์ ์ฒ๋ฆฌ ์์
์ด ๋ค ๋๊ณ ๋๋ฉด Spring MVC, DispatcherServlet์ ์์ฒญ์ ์ ๋ฌํด ์ค๋๋ค. ๊ทธ๋ ๊ฒ ๋๋ฉด DispatcherServlet์ด ์์ฒญ์ ๋ํ ์ถ๊ฐ ์์
๋ค์ ์ฒ๋ฆฌํ๊ฒ ๋ฉ๋๋ค.
๐ฝ Filter ์ด๊ธฐํ์ ๋ค์ค ๋ณด์ ์ค์
1. ์ค์ Class ๋ณ๋ก ๋ณด์ ๊ธฐ๋ฅ ๊ฐ๊ฐ ์๋.
2. ์ค์ Class ๋ณ๋ก RequestMatcher ์ค์ .
• http.antMatcher("/admin/**)
3. ์ค์ Class ๋ณ๋ก Filter ์์ฑ.
4. FilterChainProxy๊ฐ ๊ฐ๊ฐ Filter ๋ณด์ .
5. ์์ฒญ์ ๋ฐ๋ผ RequestMatcher์ ๋งค์นญ๋๋ Filter๊ฐ ์๋ํ๋๋ก ์ฒ๋ฆฌ.
๊ฐ๋ฐ์๋ WebSecurityConfigurerAdapter๋ฅผ ์ด์ฉํด์ HttpSecurity๋ฅผ ํตํด ๋ณด์ ์ค์ ์ ํ๊ฒ ๋ฉ๋๋ค.
์ด ๋, ๋ณด์ API๋ฅผ ์ค์ ํ๊ฒ ๋๋ฉด Spring Security๊ฐ ์ด๊ธฐํ๋๋ฉด์ ๊ฐ๊ฐ์ Filter๊ฐ ์์ฑ๋๊ฒ ๋ฉ๋๋ค.
์์ ๊ทธ๋ฆผ์์ SecurityConfg 1๊ณผ SecurityConfig 2๋ ๊ฐ๊ฐ ๋ณด์ ๊ธฐ๋ฅ์ด ๋ฐ๋ก ์๋ํ๋๋ก ํ ์ ์์ด์.
๋ง์ฝ SecurityConfig 1์์ RequestMatcher๋ฅผ ํตํด /admin/**์ ๋ํ ๋ณด์ ์ค์ ์ ํ๋ค๋ฉด ํด๋น ์์ฒญ์ด ๋ค์ด์์ ๋, SecurityConfig 1๋ง ์ฐธ์กฐํ๊ณ , SecurityConfig 2๋ก ๋์ด๊ฐ์ง ์์์.
์ต์ด ๋ค์ค ์ค์ Class๋ฅผ ๋ง๋ค๊ณ , Spring Security๊ฐ ์ด๊ธฐํ๊ฐ ๋๋ฉด SecurityFilterChain Class๊ฐ ์๋๋ฐ, ์ด ๊ฐ์ฒด ์์ HttpSecurity๋ฅผ ํตํด ์ค์ ํ ์ค์ ๋ Filter๊ฐ SecurityFilterChain ๊ฐ์ฒด ์ ๋ณ์๋ก ๋ด๊ธฐ๊ฒ ๋๊ณ , http.antMatcher๋ฅผ ํตํด ์
๋ ฅํ URI๋ RequestMacher๋ผ๋ ๊ฐ์ฒด Type์ ๋ณ์์ ๋ด๊ธฐ๊ฒ ๋ฉ๋๋ค.
์์ ๋ด์ฉ์ ๋ด์ SecurityFilterChain ๊ฐ์ฒด๊ฐ ๊ฐ๊ฐ ์ค์ ๊ฐ์ ๋ฐ๋ผ ๋ง๋ค์ด์ง๊ฒ ๋ฉ๋๋ค.
์ด๋ ๊ฒ ๊ฐ๊ฐ ์์ฑ๋ ๊ฐ์ฒด๋ฅผ FilterChainProxy๊ฐ Filter Type์ List ๋ณ์์ ์ ์ฅ์ ํ๊ฒ ๋ฉ๋๋ค.
๊ฒฐ๊ตญ ๋ค์ค ์ค์ Class๋ก ๋ง๋ค์ด์ง ๋ค ์ค์ ์ค์ Filter๋ค์ FilterChainProxy๊ฐ ๊ฐ์ง๊ณ ์๊ฒ ๋๋ ๊ฒ์ด์์.
๋ง์ฝ ์ด์ฉ์๊ฐ /admin ์ผ๋ก ์์ฒญ์ ๋ณด๋ด๊ฒ ๋๋ฉด FilterChainProxy๊ฐ ์์ฒญ์ ๋ฐ๊ฒ ๋๊ณ , ๊ฐ SecurityConfig ๋ด์ฉ ์ค ํ๋๋ฅผ ์ ํํด์ ํด๋น ๊ฐ์ฒด Filter์ ์์
์ ์์ฒญํ๊ฒ ๋ฉ๋๋ค.
์์ ๊ทธ๋ฆผ์์๋ /admin URI์ ๋ํ RequestMacher๊ฐ SecurityConfig 1์ ์์ด์.
๊ทธ๋ ๋ค๋ฉด FilterChainProxy๋ SecurityConfig 1์ SecurityFilterChain ๊ฐ์ฒด๊ฐ ๊ฐ์ง๊ณ ์๋ Filters ๋ณ์๋ค์ ๊ฐ์ง๊ณ ์จ ๋ค ์ธ์ฆ / ์ธ๊ฐ ์ฒ๋ฆฌ๋ฅผ ํ๊ฒ ๋๋ ๋ฐฉ์์
๋๋ค.
์์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด์ ๊ณต๋ถ๋ฅผ ํด ๋ณผ๊ฒ์.
์ด์ฉ์๊ฐ ์ต์ด GET ๋ฐฉ์์ผ๋ก /admin URI์ ์ ๊ทผ ์์ฒญ์ ๋ณด๋์ด์.
๊ทธ๋ฌ๋ฉด FilterChainProxy๊ฐ ํด๋น ์์ฒญ์ ๋ฐ๊ฒ ๋๊ณ , ํด๋น ์์ฒญ์ ์ฒ๋ฆฌํ Filter๋ฅผ ์ ํํด์ผ ํ๋๋ฐ, ์์ฒญ URI์ Magching์ด ๋๋ ์ฆ, matches์์ True๊ฐ์ด ๋์ค๋ Config Filter๋ฅผ ๊ฐ์ ธ์์ผ ํด์.
์ด ๋, FilterChainProxy๊ฐ ์ ์ฅํ๊ณ ์๋ ๊ฐ๊ฐ์ SecurityFilterChain ๊ฐ์ฒด๋ค ์ค RequestMatcher ๋ด์ Matching์ด ๋๋ ๊ฒ์ ์ฐพ๊ฒ ๋ฉ๋๋ค.
(SecurityConfig 2์ RequestMacher๋ anyRequest ์
๋๋ค.)
๊ทธ๋ ๊ฒ ๋๋ฉด SecurityConfig 1 ๋ด์ SecurityFilterChain์ด ๊ฐ์ง๊ณ ์๋ RequestMacher์ ๋งค์นญ์ด ๋ฉ๋๋ค.
๊ทธ๋ผ ํด๋น ๊ฐ์ฒด ์์ Filter๊ฐ ๋์ํ๋๋ก ์ ํํ๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฐ ๋ค ์ธ์ฆ / ์ธ๊ฐ ์ฒ๋ฆฌ๋ฅผ ํ๊ฒ ๋๋ ๊ฒ์ด์์.
/admin์ด ์๋ ๋ค๋ฅธ URI๋ก ์ค๋ ์์ฒญ์ ๋ํด์๋ SecurityConfig 2 ๋ด์ฉ์ ๊ฐ์ ธ์ค๊ณ , ๋์ํ๊ฒ ๋ ๊ฒ์ด์์.
์ด ์ ์ ์์ฑํ๋ Code์ ๋ค๋ฅธ ์๋ก์ด Config Code๋ฅผ ์์ฑํ์ด์.
์ด๋ ๊ฒ ํ๊ณ , Server๋ฅผ ๊ธฐ๋ํ๋ฉด ์๋์ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฑฐ์์.
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2022-08-16 16:22:00.129 ERROR 2702 --- [ main] o.s.boot.SpringApplication : Application run failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration': Injection of autowired dependencies failed; nested exception is java.lang.IllegalStateException: @Order on WebSecurityConfigurers must be unique. Order of 100 was already used on com.junyharang.spring.security.config.SecurityMultiConfig$$EnhancerBySpringCGLIB$$941cc1dd@21c815e4, so it cannot be used on com.junyharang.spring.security.config.SecurityMultiConfig2$$EnhancerBySpringCGLIB$$21af67c3@7342e05d too.
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:405) ~[spring-beans-5.3.20.jar:5.3.20]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1431) ~[spring-beans-5.3.20.jar:5.3.20]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:619) ~[spring-beans-5.3.20.jar:5.3.20]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.20.jar:5.3.20]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.20.jar:5.3.20]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.20.jar:5.3.20]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.20.jar:5.3.20]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.20.jar:5.3.20]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:953) ~[spring-beans-5.3.20.jar:5.3.20]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) ~[spring-context-5.3.20.jar:5.3.20]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[spring-context-5.3.20.jar:5.3.20]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) ~[spring-boot-2.7.0.jar:2.7.0]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:734) ~[spring-boot-2.7.0.jar:2.7.0]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) ~[spring-boot-2.7.0.jar:2.7.0]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) ~[spring-boot-2.7.0.jar:2.7.0]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) ~[spring-boot-2.7.0.jar:2.7.0]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) ~[spring-boot-2.7.0.jar:2.7.0]
at com.junyharang.spring.security.JunyharangSpringSecutiryApplication.main(JunyharangSpringSecutiryApplication.java:10) ~[classes/:na]
Caused by: java.lang.IllegalStateException: @Order on WebSecurityConfigurers must be unique. Order of 100 was already used on com.junyharang.spring.security.config.SecurityMultiConfig$$EnhancerBySpringCGLIB$$941cc1dd@21c815e4, so it cannot be used on com.junyharang.spring.security.config.SecurityMultiConfig2$$EnhancerBySpringCGLIB$$21af67c3@7342e05d too.
at org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration.setFilterChainProxySecurityConfigurer(WebSecurityConfiguration.java:165) ~[spring-security-config-5.7.1.jar:5.7.1]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:724) ~[spring-beans-5.3.20.jar:5.3.20]
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119) ~[spring-beans-5.3.20.jar:5.3.20]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399) ~[spring-beans-5.3.20.jar:5.3.20]
... 17 common frames omitted
๋์ VM์์ ์ฐ๊ฒฐ ํด์ ๋์์ต๋๋ค. ์ฃผ์: '127.0.0.1:50961', ์ ์ก: '์์ผ'
์ข
๋ฃ ์ฝ๋ 1(์ผ)๋ก ์๋ฃ๋ ํ๋ก์ธ์ค
์ด๊ฒ์ WebSecurityConfigurers์ uniqueํ Annotation @order๊ฐ ์๋๋ฐ, Spring Security Config๋ฅผ N๊ฐ ๋ง๋ค ๊ฒฝ์ฐ ์ค์ ์ ๋ฐ๋ผ์ ์์๋ฅผ ์ ์ํด ์ค์ผ ํด์.
๊ทธ๋์ ๊ทธ ์์๋ฅผ ์ ์ํ๊ธฐ ์ํ Annotation @order๋ฅผ ์ด์ฉํด์ ์์๋ฅผ ์ ์ํด ๋ฌ๋ผ๋ ๊ฑฐ์์.
์ด๋ ๊ฒ ์์ ๊ฐ์ด ์์ ์ ํด์ฃผ๊ณ ๋ค์ ๊ธฐ๋์ ํ๋ฉด ์๋์ ๊ฐ์ด ์ ์ ๊ธฐ๋์ด ๋ฉ๋๋ค.
๐ฝ ์ธ์ฆ ๊ฐ๋ ์ดํด
๐ฆ Authentication
Authentication์ด๋? ์ธ์ฆ ์ฆ, ์ด์ฉ์๊ฐ ๋๊ตฌ์ธ์ง ์ฆ๋ช
ํ๋ ๊ฒ์ด์์.
1. ์ด์ฉ์์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ Token ๊ฐ๋
.
2. ์ธ์ฆ ์ ID, Password๋ฅผ ๋ด๊ณ ์ธ์ฆ ๊ฒ์ฆ์ ์ํด ๊ฐ Class ๋ง๋ค ์ ๋ฌ ๋์ด ์ฌ์ฉ.
3. ์ธ์ฆ ๋ค ์ต์ข
์ธ์ฆ ๊ฒฐ๊ณผ (USER ๊ฐ์ฒด, ๊ถํ ์ ๋ณด)๋ฅผ ๋ด๊ณ SecurityContext์ ์ ์ฅ๋์ด ์ ์ญ์ ์ผ๋ก ์ฐธ์กฐ ๊ฐ๋ฅ.
• Authentication authentication = SecurityContextHolder.getContext().getAuthentication()
4. ๊ตฌ์กฐ (Authentication์ Interface).
• principal(Spring Secutiry๊ฐ ์๋ JAVA๊ฐ ์ง์) : ์ด์ฉ์ ID ํน์ USER ๊ฐ์ฒด ์ ์ฅ.
• credntials : ์ด์ฉ์ Password.
• authorities : ์ธ์ฆ๋ ์ด์ฉ์ ๊ถํ ๋ชฉ๋ก.
• details : ์ธ์ฆ ๋ถ๊ฐ ์ ๋ณด.
• Authenticated : ์ธ์ฆ ์ฌ๋ถ.
์ต์ด ์ด์ฉ์๊ฐ Login์ ์๋ํ ๋, ID์ Password๋ฅผ Server์ ๋๊ฒจ์ฃผ๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ฉด UsernamePasswordAuthenticationFilter(์ธ์ฆ Filter)๊ฐ ID(Username)์ Password ์ ๋ณด๋ฅผ ์ถ์ถํ ๋ค Authentication Type ๊ฐ์ฒด๋ฅผ ํ๋ ๋ง๋ค๊ฒ ๋ฉ๋๋ค.
์ด ๋, princlpal์๋ ์ด์ฉ์ ID๋ฅผ ๋ฃ๊ณ , credentials์๋ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ด๊ณ , ์ ๋ฌ๋๊ฒ ๋ฉ๋๋ค.
AntuehticationManager๊ฐ ์ธ์ฆ ๊ฐ์ฒด๋ฅผ ๊ฐ์ง๊ณ , ์ธ์ฆ ์ฒ๋ฆฌ๋ฅผ ํ๊ฒ ๋๊ณ , ์ธ์ฆ์ด ์คํจํ๊ฒ ๋๋ฉด ์์ธ๊ฐ ๋ฐ์ํ๊ฒ ๋๊ณ , ์คํจ์ ๋ํ ํ์ ์ฒ๋ฆฌ๋ฅผ ํ๊ฒ ๋๊ณ , ์ฑ๊ณตํ๊ฒ ๋๋ฉด Authentication Type์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ฒ ๋๋๋ฐ, princlpal์๋ ์ด์ฉ์ ID๋ฅผ ๋ฃ๊ณ , credentials์๋ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ด๋๋ฐ, ๋ณด์์ ๋น์ด๋๊ธฐ๋ ํฉ๋๋ค.
Authorities์๋ ๊ถํ ์ ๋ณด ๋ชฉ๋ก์ ๋ด๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฌ๊ณ ๋ ๋ค SecurityContextHolder ์์ SecurityContext ๊ฐ์ฒด์ ํด๋น ์ธ์ฆ ๊ฐ์ฒด(Authentication)์ ๋ด๊ฒ ๋๊ณ , ์ด ์ธ์ฆ ๊ฐ์ฒด๋ฅผ ์ ์ญ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๊ฒ ํด ์ค๋๋ค.
๐ฝ ์ธ์ฆ ์ ์ฅ์
์ต์ด ์ด์ฉ์๊ฐ Login์ ์๋ํฉ๋๋ค.
Server๊ฐ Login ์์ฒญ์ ๋ฐ๊ฒ ๋๋ฉด Server๋ ํด๋น ์ด์ฉ์์ ๋ํ Thread ํ๋๋ฅผ ์์ฑํ๊ฒ ๋ฉ๋๋ค.
์ด ๋, ThreadLocal์ด๋ผ๋ Thread ์ ์ญ ์ ์ฅ์๊ฐ Thread ๋ง๋ค ํ ๋น์ด ๋ฉ๋๋ค.
ํด๋น Thrad๋ ์ธ์ฆ์ ์ฒ๋ฆฌํ๊ฒ ๋๋๋ฐ, ์ด ๋, ์ธ์ฆ Filter์ธ UsernamePasswordAuthenticationFilter๊ฐ ๋์ํ๊ฒ ๋ฉ๋๋ค. ์ต์ด Authentication ๊ฐ์ฒด๋ฅผ ๋ง๋๋๋ฐ, ID์ Password๋ง ๋ด๊ธฐ ์ํด principal์๋ ID ๊ฐ์ Credentials์๋ Password๊ฐ์ ๋ด๊ฒ ๋๊ณ , ๋๋จธ์ง๋ ๋ด์ง ์์ต๋๋ค.
๊ทธ๋ฐ ๋ค ์ธ์ฆ์ ์๋ํด์ ์ธ์ฆ์ด ์คํจํ๊ฒ ๋๋ฉด SecurityContextHolder.clearContext()๋ฅผ ํธ์ถํ์ฌ SecurityContext๊ฐ์ Null๋ก ์ด๊ธฐํํ๋ ์์
์ ํ๊ณ , ์ธ์ฆ์ด ์ฑ๊ณตํ๋ค๋ฉด UsernamePasswordAuthenticationFilter๊ฐ SecurityContextHolder์์ SecurityContext ๊ฐ์ฒด ์์ ์ต์ข
์ธ์ฆ ์ฑ๊ณตํ ์ธ์ฆ ๊ฐ์ฒด๋ฅผ ๋ด๋ ์ฒ๋ฆฌ๋ฅผ ํ๊ฒ ๋ฉ๋๋ค.
์ด ๋, ์ด์ฉ์์๊ฒ ํ ๋น๋ ๊ถํ์ด ๋ด๊ธฐ๊ฒ ๋๊ณ , ์ธ์ฆ ์ฌ๋ถ๊ฐ True๋ก ๋ฐ๋๊ฒ ๋ฉ๋๋ค.
์ข ๋ ์ธ๋ถ์ ์ผ๋ก ์ด์ผ๊ธฐ ํ์๋ฉด SecurityContextHolder๋ ThradLocal ๊ฐ์ฒด๋ฅผ ๊ฐ์ง๊ณ ์๊ฒ ๋๊ณ , ThradLocal ๊ฐ์ฒด๊ฐ SecurityContext ๊ฐ์ฒด๋ฅผ ๋ด๊ณ ์๋ค๊ณ ๋งํ๋๊ฒ ๋ ์ ํํฉ๋๋ค.
๊ทธ๋ฐ ๋ค ์ต์ข
์ ์ผ๋ก SecurityContext ๊ฐ์ฒด๊ฐ HttpSession ๊ฐ์ฒด์ ์ ์ฅ์ด ๋ฉ๋๋ค. ์ด ๋, ์ด๋ฆ์ SPRING_SECURITY_CONTEXT๋ก ์ ์ฅ๋์.
๐ฆ SecurityContextHolder
1. SecurityContext ๊ฐ์ฒด ์ ์ฅ ๋ฐฉ์.
• MODE_THREADLOCAL : Thread ๋น SecurityContext ๊ฐ์ฒด ํ ๋น (Default Value).
• MODE_INHERITABLETHREADLOCAL : Main Thread์ ์์ Thread์ ๊ดํ์ฌ ๋์ผ SecurityContext ์ ์ง.
• MODE_GLOBAL : ์์ฉ ํ๋ก๊ทธ๋จ์์ ๋จ ํ๋์ SecurityContext ์ ์ฅ.
2. SecurityContextHolder.clearContext() : SecurityContext ๊ธฐ์กด ์ ๋ณด ์ด๊ธฐํ.
๐ฆ SecurityContext
1. Authentication ๊ฐ์ฒด๊ฐ ์ ์ฅ๋๋ ๋ณด๊ด์. ํ์ ์ ์ธ์ ๋ ์ง Authentication ๊ฐ์ฒด๋ฅผ ๊บผ๋ด ์ธ ์ ์๋๋ก ์ ๊ณต๋๋
Class.
2. ThreadLocal์ ์ ์ฅ๋์ด ์๋ฌด ๊ณณ์์๋ ์ฐธ์กฐ๊ฐ ๊ฐ๋ฅํ๋๋ก ์ค๊ณ.
• Thread๋ Thread๋ง๋ค ๊ณ ์ ํ๊ฒ ํ ๋น๋ ์ ์ฅ์๊ฐ ์๋๋ฐ, ๊ทธ ์ ์ฅ์๋ฅผ Thread Local์ด๋ผ๊ณ ํ๋ค.
• ํด๋น ์ ์ฅ์์๋ ์ฃผ์ธ Thread๋ง ์ ๊ทผ ๋ฐ Data ์ ์ฅ์ด ๊ฐ๋ฅ.
• Set, Get Method ๋ฑ ํตํด Data Handling ๊ฐ๋ฅ.
• Data๋ฅผ Set์ผ๋ก ์ ์ฅํ ๋ค, Get์ผ๋ก ์ฐธ์กฐ๊ฐ ๊ฐ๋ฅํ๋ฐ, ์ ์ฅ ์ด ํ Get์ผ๋ก ์ฐธ์กฐ๋ฅผ ํ ๋, ์ฅ์์ ๊ตฌ์ ๋ฐ์ง ์๋๋ค.
์๋ฅผ ๋ค์ด A๋ผ๋ Method์์์ Thread Local์ด Set์ผ๋ก ์ ์ฅ์ ํ๊ณ , ๋ค๋ฅธ ์ฅ์์ธ B Method์์ Get์ ํตํด
A Method์์ ์ ์ฅํ Data๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
3. ์ธ์ฆ ์๋ฃ ์ HttpSession์ ์ ์ฅ๋์ด Application ์ ๋ฐ์ ๊ฑธ์ณ ์ ์ญ ์ฐธ์กฐ ๊ฐ๋ฅ.
๐ฝ ์ธ์ฆ ์ ์ฅ์ Filter
๐ฆ SecurityContextPersistenceFilter
1. SecurityContext ๊ฐ์ฒด์ ์์ฑ, ์ ์ฅ, ์กฐํ
• ์ต๋ช
์ด์ฉ์
- ์๋ก์ด SecurityContext ๊ฐ์ฒด ์์ฑ ๋ค SecurityContextHolder์ ์ ์ฅ.
- AnonymousAuthenticationFilter์์ AnnonymousAuthenticationToken(์ต๋ช
์ด์ฉ์์ฉ ์ธ์ฆ ๊ฐ์ฒด)
๊ฐ์ฒด๋ฅผ SecurityContext์ ์ ์ฅ.
• ์ธ์ฆ ์
- ์๋ก์ด SecurityContext ๊ฐ์ฒด ์์ฑ ๋ค SecurityContextHolder์ ์ ์ฅ.
- UsernamePasswordAuthenticationFilter ์์ ์ธ์ฆ ์ฑ๊ณต ๋ค SecurityContext์
UsernamePasswordAuthenticationToken ๊ฐ์ฒด๋ฅผ SecurityContext์ ์ ์ฅ.
- ์ธ์ฆ์ด ์ต์ข
์๋ฃ ๋๋ฉด ์๋ต ํ๋ ์์ ์ Session์ SecurityContext ์ ์ฅ.
• ์ธ์ฆ ๋ค
- Session์์ SecurityContext ๊ฐ์ฒด๋ฅผ ๊บผ๋ด SecurityContextHolder์์ ์ ์ฅ.
- SecurityContext ์ Authentication ๊ฐ์ฒด๊ฐ ์กด์ฌํ๋ฉด ๊ณ์ ์ธ์ฆ ์ ์ง.
• ์ต์ข
์๋ต ์ ๊ณตํต
- SecurityContextHolder.clearContext()
์ต์ด ์ด์ฉ์๊ฐ ์ธ์ฆ์ ์์ฒญํฉ๋๋ค.
SecurityContextPersistenceFilter๋ ๋งค ์์ฒญ๋ง๋ค ํด๋น ์์ฒญ์ ์ฒ๋ฆฌํ๊ฒ ๋ฉ๋๋ค.
์ธ์ฆ์ ์์ฒญํ๋ ์ด์ฉ์, ์ธ์ฆ์ ๋ฐ์ ์ด์ฉ์, ์ต๋ช
์ด์ฉ์ ๋ฑ ๋ชจ๋ SecurityContextPersistenceFilter๊ฐ ์์ฒญ์ ์ฒ๋ฆฌํ๊ฒ ๋ฉ๋๋ค.
SecurityContextPersistenceFilter ์์๋ HttpSecurityContextRepository Class๊ฐ ์๋๋ฐ, ์ค์ HttpSecurityContextRepository๊ฐ SecurityContext ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ์กฐํ ๋ฑ์ ํ๋ ์ญํ ์ ํฉ๋๋ค.
์ด์ ์ด์ฉ์๊ฐ ์ธ์ฆ์ ๋ฐ์๋์ง ์ฌ๋ถ๋ฅผ ํ๋จํ๊ฒ ๋ฉ๋๋ค.
์ด ๋, Session์ SecurityContext๊ฐ ์๋์ง๋ฅผ ํ์ธํ๊ฒ ๋๋๋ฐ, ๋น์ฐํ ์ธ์ฆ ์ ์ด๊ฑฐ๋, ์ต๋ช
์ด์ฉ์๊ฐ ์ ๊ทผํ๊ฒ ๋๋ฉด
SecurityContext๊ฐ ์กด์ฌํ์ง ์์๊ฑฐ์์.
๊ทธ๋์ ์ธ์ฆ์ ๋ฐ๊ธฐ ์ ์ด๊ณ , ์ธ์ฆ์ ์์ฒญํ๊ณ ์๋ค๋ฉด ์๋ก์ด SecurityContext๋ฅผ ์์ฑํ๊ฒ ๋ฉ๋๋ค.
์ด๋ ์ต๋ช
์ด์ฉ์, ์ธ์ฆ์ ๋ฐ๊ธฐ ์์ ์ ์ด์ฉ์๋ ๋์ผํด์.
์ด ๋๋ Authentication (์ธ์ฆ ๊ฐ์ฒด)๊ฐ Null์ธ ์ํ์์.
์์ฒญ์ ๊ทธ ๋ค์ Filter๋ก ์ด๋(chain.doFilter)๋๊ฒ ๋ฉ๋๋ค.
AuthFilter ์๋ฅผ ๋ค์ด Form ์ธ์ฆ์ ๊ฒฝ์ฐ UsernamePasswordAuthenticationFilter๊ฐ ๋ ๊ฒ์ธ๋ฐ, ํด๋น ์ธ์ฆ Filter๊ฐ ์ธ์ฆ์ ์ฒ๋ฆฌํ๊ฒ ๋ฉ๋๋ค.
์ธ์ฆ์ด ์๋ฃ๊ฐ ๋๋ฉด ํด๋น ์ธ์ฆ Filter๊ฐ SecurityContextHolder ์์์ SecurityContext ๊ฐ์ฒด ์์ ์ธ์ฆ์ ์ฑ๊ณตํ ๊ฒฐ๊ณผ๋ฌผ์ธ Authentication(์ธ์ฆ ๊ฐ์ฒด)๋ฅผ ์ ์ฅํ๊ฒ ๋ฉ๋๋ค.
๊ฒฐ๊ตญ SecurityContextPersistenceFilter๋ ์ธ์ฆ ์์ฒญ์ด ์์ ๋,SecurityContext ๊ฐ์ฒด ์์ฑ๋ง ๋ด๋นํ๊ณ , ๋ค์ Filter๋ก ๋๊ธฐ๋ ์์
๋ง ํ๋ ๊ฒ์ด์์.
์์ฒญ์ ๊ทธ ๋ค์ Filter๋ก ์ด๋(chain.doFilter)๋๊ฒ ๋ฉ๋๋ค.
์ต์ข
์ ์ผ๋ก ์ธ์ฆ ๊ฒฐ๊ณผ๋ฅผ Client์๊ฒ ์๋ตํ๋ ค ํ ๋, Session ์์ SecurityContext ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๊ฒ ๋ฉ๋๋ค.
์ด ์์
์ ์ธ์ฆ Filter๊ฐ ์๋ SecurityContextPersistenceFilter๊ฐ ์์
์ ํ๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฐ ๋ค์ SecurityContextHolder์์ SecurityContext ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
์ ๊ฑฐํ๋ ์ด์ ๋ ๋งค ์์ฒญ์ ๋ง๋ค SecurityContextPersistenceFilter๋ ์๋ก์ด SecurityContext ๊ฐ์ฒด๋ฅผ SecurityContextHolder์์ ์์ฑํ๊ฒ ๋ ํ
๋ฐ, ์ด๋ฏธ Session์ ํด๋น ๊ฐ์ฒด๊ฐ ์ ์ฅ๋์๊ธฐ ๋๋ฌธ์ ๊ฐ์ ๊ฐ์ ๊ณ์ ๋์ ํด์ ๊ฐ์ง๊ณ ์์ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ด์์.
๊ทธ๋ฐ ๋ค์ ์ต์ข
์ ์ผ๋ก Client์๊ฒ ์๋ต์ ๋ณด๋ด๊ฒ ๋ฉ๋๋ค.
์ธ์ฆ์ด ์ฑ๊ณตํ ๋ค ์ด์ฉ์๋ ์ด๋ค ์์์ ์ ๊ทผ ์์ฒญ์ ๋ณด๋ผ ์ ์์ต๋๋ค.
์ด ๋์๋ ์ญ์ SecurityContextPersistenceFilter๊ฐ ์์ฒญ์ ๋ฐ๊ฒ ๋๊ณ , HttpSecurityContextRepository๊ฐ ์์ฒญ์ ์ค์ ๋ก ์ฒ๋ฆฌํ๊ฒ ๋ฉ๋๋ค.
์ด ๋์๋ ์ธ์ฆ์ ์ฑ๊ณตํ ๋ค์ด๊ธฐ ๋๋ฌธ์ Session์ SecurityContext ๊ฐ์ฒด๊ฐ ์กด์ฌํ ๊ฑฐ์์.
์๋ํ๋ฉด ์ธ์ฆ ์์ ์ Session์ SecurityContext๋ฅผ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ด์์.
์ด์ ๋ Session์ ์ ์ฅ๋ SecurityContext ๊ฐ์ฒด๋ฅผ ๊บผ๋ด์ SecurityContextHolder์ SecurityContext ๊ฐ์ฒด ์์ Authentication(์ธ์ฆ ๊ฐ์ฒด)๋ฅผ ์ ์ฅ ํฉ๋๋ค.
๊ทธ๋ฐ ๋ค ๊ทธ ๋ค์ Filter๋ก ์ด๋(chain.doFilter)๋๊ฒ ๋ฉ๋๋ค.
์กฐ๊ธ ๋ ๋ด์ฉ์ ์์ฝํด ๋ณด์๋ฉด SecurityContextPersistenceFilter๋ ์ธ์ฆ ๋ฐ๊ธฐ ์ ์ด๋ผ๋ฉด ์๋ก์ด SecurityContext๋ฅผ ์์ฑํ๊ฒ ๋๋๋ฐ, ๊ตฌ์กฐ๋ฅผ ๋ณด๋ฉด SecurityContextHolder ์์ ThreadLocal์ด ์๊ณ , ๊ทธ ์์ SecurityContext๋ฅผ ์์ฑํ๊ฒ ๋๋๋ฐ, ์ธ์ฆ์ ๋ฐ๊ธฐ ์ ์ด๊ธฐ ๋๋ฌธ์ Null์ธ ์ํ๋ก ๋ง๋ค๊ฒ ๋ฉ๋๋ค.
์ธ์ฆ์ ๋ฐ์ ๋ค๋ผ๋ฉด ์๋ก์ด SecurityContext๋ฅผ ์์ฑํ๊ฒ ๋๋๋ฐ, ๊ตฌ์กฐ๋ฅผ ๋ณด๋ฉด SecurityContextHolder ์์ ThreadLocal์ด ์๊ณ , ๊ทธ ์์ SecurityContext๋ฅผ ์์ฑํ๊ฒ ๋๋๋ฐ, ์ธ์ฆ ์ฑ๊ณตํ Authentication (์ธ์ฆ ๊ฐ์ฒด)๋ฅผ ์ ์ฅํ๊ฒ ๋ฉ๋๋ค.
์ธ์ฆ์ ๋ฐ์ ๋ค ์์ ์ ๊ทผ๊ณผ ๊ฐ์ ์์ฒญ์ด ์ค๊ฒ ๋๋ฉด Session์ SecurityContext ๊ฐ์ฒด๋ฅผ ๊บผ๋ด SecurityContextHolder ์์ ๋ด๋ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌ๊ฐ ๋ฉ๋๋ค.
๐ฝ ์ธ์ฆ ํ๋ฆ ์ดํด
๐ฆ Authentication Flow
์ด์ฉ์๊ฐ Form ์ธ์ฆ ๋ฐฉ์์ ์ธ์ฆ ์์ฒญ์ ๋ณด๋์ ๋, ์ด๋ค์ผ์ด ๋ฒ์ด์ง๋์ง ์์๋ณผ๊ฒ์.
UsernamePasswordAuthenticationFilter(Form ์ธ์ฆ ์ฒ๋ฆฌ Filter)๋ ์ต์ด ์ด ์์ฒญ์ ๋ฐ๊ฒ ๋ฉ๋๋ค.
์ด ์น๊ตฌ๋ ๊ฐ์ฅ ๋จผ์ ID์ Password๋ฅผ ๋ฐ์ ์ธ์ฆ ๊ฐ์ฒด Authentication์ ๋ง๋ค๊ฒ ๋ฉ๋๋ค.
UsernamePasswordAuthenticationFilter๋ AuthenticationManager์๊ฒ ํด๋น ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ๋ฉด์ ์ธ์ฆ ์ฒ๋ฆฌ๋ฅผ ์ ๋ฌํ๊ฒ ๋ฉ๋๋ค.
์ฌ๊ธฐ๊น์ง๊ฐ Filter๊ฐ ์ธ์ฆ ์ฒ๋ฆฌ๋ฅผ ํ๋ ์ฒซ๋ฒ์งธ ๋จ๊ณ์
๋๋ค.
AuthenticationManager๋ ์ธ์ฆ์ ์ ๋ฐ์ ์ธ ๊ด๋ฆฌ๋ ํ์ง๋ง, ์ค์ ์ธ์ฆ ์ญํ ์ ํ์ง ์๊ณ , ์ ์ ํ AuthenticationProvider์ ์์
์ ์์ํ๋ ์ญํ ์ ํฉ๋๋ค. ์ฆ, ID, Password๊ฐ์ด ์ ์์ธ์ง ํ์ธํ๋ ๊ณผ์ ์ ๊ฐ์
ํ์ง ์์์.
๊ด๋ฆฌ์ Manager๋๊น ์ผ์ ์ํค๊ธฐ๋ง ํด์.
AuthenticationManager์๋ List ๋ณ์๊ฐ ์๋๋ฐ, ํ ๊ฐ ์ด์์ AuthenticationProvider ๊ฐ์ฒด๋ฅผ ๋ด์ ์ ์๊ฒ ๋์ด ์์ต๋๋ค. ํด๋น List ์์ ์๋ AuthenticationProvider ๊ฐ์ฒด๋ค ์ค ํ์ฌ ์ธ์ฆ ์ฒ๋ฆฌ์ ์ ํฉํ ๊ฐ์ฒด๋ฅผ ์ฐพ์ ํด๋น AuthenticationProvider์๊ฒ ์ธ์ฆ ์์
์ ์์ํ๊ฒ ๋ฉ๋๋ค.
AuthenticationProvider๋ Manager๋ก ๋ถํฐ ์ธ์ฆ ๊ฐ์ฒด์ธ Authentication์ ์ ๋ฌ ๋ฐ์๊ณ , ID, Password ๊ฒ์ฆ ์์
์ ๋์
ํ๊ฒ ๋ฉ๋๋ค.
์ต์ด ID(Spring Security์์๋ ID๋ฅผ username ๋ณ์๋ช
์ผ๋ก ์ฒ๋ฆฌ)๋ฅผ ๊ฒ์ฆํ ๋, loadUserByUsername()์ ํธ์ถํ๋ฉด์ ์ด์ฉ์ ID๋ฅผ ์ ๋ฌํด์ฃผ๊ฒ ๋์.
์ด ์น๊ตฌ๋ ์ค์ ์ธ์ฆ ์ฒ๋ฆฌ๋ฅผ ํ๊ณ , ์ด์ฉ์ ์ ํจ์ฑ ๊ฒ์ฆ(Password ํ์ธ ๋ฑ)์ ๋ด๋นํ๊ณ ์์ด์.
๋ง์ฝ ํด๋น username์ผ๋ก ๋ ID๊ฐ์ด Data Base์ ์กด์ฌํ๋ฉด ์ธ์ฆ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ฒ ๋๊ณ , ์กด์ฌํ์ง ์์ผ๋ฉด UsernameNotFoundException์ด ํฐ์ง๊ฒ ๋ ๊ฑฐ์์.
์ด๋ ๊ฒ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ๊ทธ ์ฆ์ ์ธ์ฆ ์คํจ ์ฒ๋ฆฌ๊ฐ ๋์ด๋ฒ๋ฆฌ๋๋ฐ, UsernamePasswordAuthenticationFilter๊ฐ ์ด ์์ธ๋ฅผ ๋ฐ์์ ์ฒ๋ฆฌํ๊ฒ ๋ฉ๋๋ค. ์ฆ, FailHandler๊ฐ ๋ฐ์์ ํ์ ์ฒ๋ฆฌ๋ฅผ ์งํํ๊ฒ ๋์.
๋ง์ฝ ID์ ํด๋นํ๋ username์ด ์กด์ฌํ๋ค๋ฉด AuthenticationProvider์๊ฒ ๋ฐํ์ ํ๊ฒ ๋๋๋ฐ, UserDetails ๊ฐ์ฒด Type์ผ๋ก ๋ฐํํ๊ฒ ๋ฉ๋๋ค.
User ๊ฐ์ฒด Type์ผ๋ก Repository๊ฐ ๋๊ฒจ์ฃผ๋๋ผ๋ UserDetails Type์ผ๋ก ํ๋ณํ์ ํด์ ๋ฐํํด์ผ ํฉ๋๋ค.
๊ทธ๋ฐ ๋ค AuthenticationProvider๋ ID๋ ๊ฒ์ฆ์ด ๋๋ ์ํ์ด๊ธฐ ๋๋ฌธ์ Password๋ฅผ ๊ฒ์ฆํ๋ ๋จ๊ณ๋ฅผ ๊ฑฐ์น๊ฒ ๋์.
์ด์ฉ์๊ฐ ์
๋ ฅํ Password ๊ฐ๊ณผ Data Base์ ์ ์ฅ๋ Password ๊ฐ์ด ์ผ์นํ๋์ง ๊ฒ์ฆ์ ํ๊ฒ ๋ฉ๋๋ค.
๋ง์ฝ Password๊ฐ ์ผ์นํ์ง ์์ผ๋ฉด BadCredentialsException์ด ํฐ์ง๊ฒ ๋์. ๊ฒฐ๊ตญ ์ธ์ฆ์ ์คํจํ๊ฒ ๋ฉ๋๋ค.
Password๊ฐ ์ผ์นํ๋ค๋ฉด ์ธ์ฆ์ด ๋ชจ๋ ์ฑ๊ณตํ๊ฒ ๋ ๊ฒ์ด๊ณ , Authentication ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ UserDetails(์ด์ฉ์ ์ ๋ณด) ๊ฐ์ฒด์ ๊ถํ ์ ๋ณด๋ฅผ ๋ด์ authorities ๊ฐ์ฒด๋ฅผ ๋ด์ Token ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ฒ ๋ฉ๋๋ค.
ํด๋น ๊ฐ์ฒด๋ฅผ AuthenticationManager์๊ฒ ๋ค์ ์ ๋ฌํด์ฃผ๊ฒ ๋๊ณ , AuthenticationManager๋ AuthenticationProvider๊ฐ ์ ๋ฌํด ์ค Authentication ๊ฐ์ฒด๋ฅผ UsernamePasswordAuthenticationFilter์๊ฒ ๋ค์ ๋ฐํํด ์ค๋๋ค.
UsernamePasswordAuthenticationFilter๋ ๋ง์ง๋ง์ผ๋ก SecurityContextHolder ์์ SecurityContext์ ํด๋น ์ธ์ฆ ๊ฐ์ฒด Authentication ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๊ฒ ๋๊ณ , Client์๊ฒ ์๋ตํด ์ค๋๋ค.
๐ฝ ์ธ์ฆ ๊ด๋ฆฌ์
๐ฆ AuthenticationManager
1. AuthenticationProvider ๋ชฉ๋ก ์ค์์ ์ธ์ฆ ์ฒ๋ฆฌ ์๊ฑด์ ๋ง๋ AuthenticatonProvider๋ฅผ ์ฐพ์ ์ธ์ฆ ์ฒ๋ฆฌ ์์.
2. ๋ถ๋ชจ ProviderManager๋ฅผ ์ค์ AuthenticationProvider ๊ณ์ ํ์ ๊ฐ๋ฅ.
AutenticationManager๋ UsernamePasswordAuthenticationFilter(Form ์ธ์ฆ ์ฒ๋ฆฌ Filter)๋ก ๋ถํฐ ์ธ์ฆ ์ฒ๋ฆฌ๋ฅผ ์ฒซ๋ฒ์งธ๋ก ์์ ๋ฐ๋ ์น๊ตฌ์์. AutenticationManager๋ Interface๋ก ๋์ด ์์ด์.
์ด๋ฅผ ๊ตฌํํ ๊ตฌํ์ฒด๊ฐ ProviderManager์์. ๋ํ, ์ค์ ์ ์ผ๋ก ์ธ์ฆ ์ฒ๋ฆฌ๋ฅผ ํ์ง๋ ์๊ณ , ProviderManager์๊ฒ ์์ํ๋ ์ญํ ๋ง ํด์.
์ต์ด ์ด์ฉ์๊ฐ ์ธ์ฆ ์์ฒญ์ ํ ๋, Spring Security๋ ์ฌ๋ฌ๊ฐ์ ์ธ์ฆ ์ฒ๋ฆฌ ๋ฐฉ์์ด ์์ด์.
์๋ฅผ ๋ค์ด ์ด์ฉ์๊ฐ Form ์ธ์ฆ ๋ฐฉ์์ผ๋ก ์ธ์ฆ ์์ฒญ์ ํ๋ค๊ณ ๊ฐ์ ํ์ ๋, UsernamePasswordAuthenticationFilter๊ฐ ProviderManager๋ฅผ ํธ์ถํ๊ฒ ๋์. ํธ์ถํ ๋, Authentication(์ธ์ฆ ๊ฐ์ฒด)๋ฅผ ํจ๊ป ์ ๋ฌํด ์ค๋๋ค.
ProviderManager๋ Authentication ๊ฐ์ฒด๋ฅผ ๋ฐ์ผ๋ฉด AuthenticationProvider์๊ฒ ์ ๋ฌํ๋ ์ญํ ๋ง ํด์.
์ด ๋, ์ฌ๋ฌ AuthenticationProvider๊ฐ ์๋๋ฐ,์ ํ ๊ธฐ์ค์ Form ์ธ์ฆ์ธ์ง RememberMe ์ธ์ฆ ์ธ์ง ๋ฑ๋ฑ์ ๋ง๋ AuthenticationProvider๋ฅผ ์ ํํ๊ฒ ๋์ด ์์ด์.
๋ง์ฝ Form ์ธ์ฆ ๋ฐฉ์์ผ ๋๋, DaoAuthenticationProvider๋ฅผ ์ฐพ์ ์ธ์ฆ ์ฒ๋ฆฌ ์์์ ํ๊ฒ ๋ฉ๋๋ค.
๋ํ, RemeberMe ์ธ์ฆ ๋ฐฉ์์ผ ๋๋, RememberMeAuthenticationProvider๋ฅผ ์ฐพ์ ์ธ์ฆ ์ฒ๋ฆฌ ์์์ ํ๊ฒ ๋ฉ๋๋ค.
์ด์ฉ์๊ฐ ๋ง์ฝ Oauth ์ธ์ฆ์ ์์ฒญํ์ ๋๋ ProviderManager๊ฐ ๊ฐ์ง๊ณ ์๋ AuthenticationProvider ์ค์ Oauth ์ธ์ฆ์ ์ฒ๋ฆฌํ ๊ฐ์ฒด๊ฐ ์์ด์. ์ด ๋๋ ProviderManager๊ฐ parent ์์ฑ์ด ์๋๋ฐ, ์ด๋ AuthenticationManager Type์ ์์ฑ์ ์ ์ฅํ ์ ์๋ ์์ฑ์ด๊ณ , ProviderManager Type์ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ ์ ์์ด์.
Spring Security๊ฐ ์ด๊ธฐํ ๋ ๋, parent ์์ฑ์ ๋ถ๋ชจ ๊ฒฉ์ธ ProviderManager ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๊ฒ ๋์.
๋ํ, ProviderManager๊ฐ์ฒด ์์๋ OauthAuthenticationProvider ๊ฐ์ฒด๊ฐ ์๊ณ , ์ ์ฅํ ์ ์์ด์.
๊ทธ๋ฆฌ๊ณ ๋์ OauthAuthenticationProvider ์ธ์ฆ ์ฒ๋ฆฌ๋ฅผ ์์ํ๊ฒ ๋ฉ๋๋ค.
๐ฝ ์ธ์ฆ ๊ด๋ฆฌ์
๐ฆ AuthenticationProvider
AuthenticationProvider๋ ์ธ์ฆ ์ฒ๋ฆฌ๋ฅผ ํ ๋, ๊ฐ์ฅ ํต์ฌ์ ์ธ ์ญํ ์ ํ๊ณ ์๋ ์น๊ตฌ์
๋๋ค.
AuthenticationProvider๋ฅผ ํตํด์ ID, Password ์ธ์ ์ถ๊ฐ ์ธ์ฆ์ ๊ด๋ จ ๊ฒ์ฆ์ ์ฒ๋ฆฌํ ์ ์์ด์.
AuthenticationProvider ๋ํ, Interface๋ก ๋ง๋ค์ด์ ธ ์์ด์.
AuthenticationProvider ์์๋ ๋ ๊ฐ์ ์ถ์ Method๊ฐ ์ ๊ณต ๋๋๋ฐ, authenticate(Authentication authentication)์ supports(Authentication authentication)๊ฐ ์์ด์. ๋ ๊ฐ Method๋ ๋ชจ๋ ๋งค๊ฐ ๋ณ์๋ก Authentication ์ฆ, ์ธ์ฆ ๊ฐ์ฒด๋ฅผ ๋ฐ๋๋ก ๋์ด ์์ด์.
authenticate(Authentication authentication)๋ ์ค์ ์ธ์ฆ์ฒ๋ฆฌ๋ฅผ ๋ด๋นํ๊ณ ์๊ณ , supports(Authentication authentication)๋ ํ์ฌ Form ์ธ์ฆ, RememberMe ์ธ์ฆ๊ณผ ๊ฐ์ ์ธ์ฆ์ ์ฒ๋ฆฌํ ์ ์๋ ์กฐ๊ฑด ํน์ ๊ธฐ์ค ๋ฑ์ ๊ฒ์ฆํ๋ ์ญํ ์ ํ๊ณ ์์ด์.
authenticate(Authentication authentication)์ ๋งค๊ฐ ๋ณ์๋ก ์ ๋ฌ ๋ฐ์ Authentication ์ธ์ฆ ๊ฐ์ฒด (ID, Password ๋ฑ์ด ๋ด๊น)๋ฅผ ๊ฐ์ง๊ณ , ID, Password, ์ถ๊ฐ ๊ฒ์ฆ์ ํ๊ณ ์์ด์.
ID ๊ฒ์ฆ์ ํ ๋๋ UserDetailsService Interface์์ Data Base ๋ฑ์ ์ ์ฅ๋ ID ๊ฐ์ด ์กด์ฌํ๋์ง ๊ฒ์ฆํ๋ ์ญํ ์ ํ๊ณ , ์๋ค๋ฉด ํด๋น ์ด์ฉ์์ USER ๊ฐ์ฒด๋ฅผ ์์ฑํด์ UserDetails ๊ฐ์ฒด Type์ผ๋ก ๋ณํํด์ AuthenticationProvider์๊ฒ ์ ๋ฌ ํ๊ณ ์์ด์.
Password ๊ฒ์ฆ์ UserDetailsService์๊ฒ ๋ฐํ ๋ฐ์ UserDetails ๊ฐ์ฒด Type์ ๊ฐ์ฒด ์์ Password ๊ฐ์ด ์๋๋ฐ, authenticate(Authentication authentication)์์ ์ ๋ฌ ๋ฐ์ Authentication ๊ฐ์ฒด ์์ ์๋ Password ๊ฐ๊ณผ
์๋ก ๋น๊ตํ๋ ์์
์ ํ๋๋ฐ, Password Encoder๋ฅผ ํตํด ์ํธํ๋ฅผ ํ๋๋ฐ, Hash ํจ์๋ก ์ํธํ๋ Password๋ฅผ ๋ณตํธํํ๋ ๊ฒ์ด ์๋ ์๋ก ๊ฐ์์ง ๋น๊ต๋ง ํ๊ฒ ๋ฉ๋๋ค.
๋ง์ฝ ๋ค๋ฅด๋ค๋ฉด BadCredentialException์ด ํฐ์ง๊ฒ ๋๊ณ , ID ๊ฒ์ฆ์ด ์คํจํ๋ฉด UserNotFoundException์ด ํฐ์ง๊ฒ ๋ฉ๋๋ค.
๋ชจ๋ ๊ฒ์ฆ์ด ์ ์์ ์ผ๋ก ๋๋๊ฒ ๋๋ฉด AuthenticationProvider๋ ์ต์ข
์ ์ผ๋ก Authentication ์ธ์ฆ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋๋ฐ, ์ด์ฉ์๊ฐ ์ธ์ฆ์ ์ฑ๊ณตํ USER ๊ฐ์ฒด์ ๊ถํ ๋ชฉ๋ก์ด ๋ด๊ธด authorities Listํ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ์ฌ AuthenticationProvider์๊ฒ ์ธ์ฆ ์ฒ๋ฆฌ๋ฅผ ์์ํ AuthenticationManager์๊ฒ ์ ๋ฌํ๊ฒ ๋ฉ๋๋ค.
๐ฝ ์ธ๊ฐ ๊ฐ๋ ๋ฐ Filter ์ดํด
์ธ๊ฐ๋? ์ด์ฉ์์๊ฒ ๋ฌด์์ด ํ๊ฐ ๋์๋์ง ์ฆ๋ช
ํ๋ ๊ฒ. (๊ถํ)
๐ฆ Authorization
์ต์ด ์ธ์ฆ ์ฒ๋ฆฌ๋ฅผ ํ๊ณ , ์ธ๊ฐ ์ฒ๋ฆฌ๋ฅผ ํ๊ฒ ๋๋๋ฐ, ์ฌ์ฉ์๊ฐ ์ด๋ค ์์์ ์ ๊ทผํ๊ธฐ ์ํ ์์ฒญ์ ํ ๋, Authenticated ์ฆ, ์ฌ์ฉ์๊ฐ ์ธ์ฆ์ ๋ฐ์๋์ง ๋ฐ์ง ์์๋์ง๋ฅผ ๋จผ์ ํ์ธํ๊ฒ ๋๊ณ , ์ธ์ฆ์ ๋ฐ์ ์ฌ์ฉ์๊ฐ ๋ค์ ์ด๋ค ์์์ ์ ๊ทผํ๋ ค๊ณ ํ ๋, ํด๋น ์ฌ์ฉ์๊ฐ ๊ฐ์ง ๊ถํ์ด ์์ฒญํ๋ ์์์ด ๊ฐ์ง๊ณ ์๋ ๊ถํ์ ์ ๊ทผํ ์ ์๋ ์๊ฒฉ์ด ์๋์ง๋ฅผ ํ์ธํ์ฌ ์ต์ข
์ ๊ทผ ์ฌ๋ถ๋ฅผ ํ๋จํ๊ฒ ๋ฉ๋๋ค.
Spring Security๋ ์ด๋ค ๊ถํ ๊ณ์ธต์ ์ง์ํ๊ณ ์์๊น์?
1. Web Layer (์น ๊ณ์ธต)
• URI ์์ฒญ์ ๋ฐ๋ฅธ Menu, ํ๋ฉด ๋จ์ Level ๋ณด์.
• ์ด์ฉ์๊ฐ ํน์ URI์ ์ ๊ทผ ์์ฒญ์ ๋ณด๋์ ๋, ํด๋น URI์ ๊ถํ๊ณผ ์ด์ฉ์ ๊ถํ ๋น๊ตํ์ฌ ์ ๊ทผ ์ฌ๋ถ ํ๋จ.
2. Service Layer (์๋น์ค ๊ณ์ธต)
• ํ๋ฉด ๋จ์๊ฐ ์๋ Method์ ๊ฐ์ ๊ธฐ๋ฅ ๋จ์ Level ๋ณด์.
• ์ด์ฉ์๊ฐ ํน์ Method(Method ์์ ๊ถํ ์ค์ )์์ ์ ๊ณตํ๋ Service์ ์ ๊ทผ ์์ฒญ์ ๋ณด๋์ ๋,
ํด๋น Method ๊ถํ๊ณผ ์ด์ฉ์ ๊ถํ ๋น๊ต ์ ๊ทผ ์ฌ๋ถ ํ๋จ.
2. Domain Layer (๋๋ฉ์ธ ๊ณ์ธต - Access Control List, ์ ๊ทผ ์ ์ด ๋ชฉ๋ก)
• ๊ฐ์ฒด ๋จ์ Level ๋ณด์.
• ์ด์ฉ์๊ฐ File, Data Base์ ๊ฐ์ Application์ ์ฐ๊ธฐ ์์
์ ํ๋ ค๊ณ ํ ๋,
ํด๋น Domain์ ์ค์ ๋ ๊ถํ๊ณผ ์ด์ฉ์ ๊ถํ ๋น๊ต ์ ๊ทผ ์ฌ๋ถ ํ๋จ.
๐ฆ FilterSecurityInterceptor
1. ๋ง์ง๋ง์ ์์นํ Filter ์ธ์ฆ๋ ์ด์ฉ์์ ๋ํ์ฌ ํน์ ์์ฒญ์ ์น์ธ / ๊ฑฐ๋ถ ์ฌ๋ถ๋ฅผ ์ต์ข
๊ฒฐ์ .
2. ์ธ์ฆ ๊ฐ์ฒด(Authentication) ์์ด ๋ณดํธ ์์์ ์ ๊ทผ ์๋ ์ AuthenticationException ๋ฐ์.
3. ์ธ์ฆ ๋ค ์์ ์ ๊ทผ ๊ฐ๋ฅ ๊ถํ์ด ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ AccessDeniedException ๋ฐ์.
4. ๊ถํ ์ ์ด ๋ฐฉ์ ์ค HTTP(URI ๋ฐฉ์) ์์ ๋ณด์ ์ฒ๋ฆฌ ๋ด๋น.
5. ๊ถํ ์ฒ๋ฆฌ๋ฅผ AccessDecisionManager์๊ฒ ์์.
์ต์ด ์ด์ฉ์๊ฐ ํน์ ์์ ์ ๊ทผ์ ์ํด ์์ฒญ์ ๋ณด๋ด๊ณ ์์ด์.
FilterSecurityIntercetptor๋ ์ด ์์ฒญ์ ๋ฐ์ ์ธ์ฆ ์ฌ๋ถ๋ฅผ ํ์ธํ๊ฒ ๋ฉ๋๋ค.
์ธ์ฆ ์ฌ๋ถ๋ฅผ ํ์ธํ ๋, ์ธ์ฆ ๊ฐ์ฒด(Authentication)๊ฐ ์กด์ฌํ๋์ง ํ์ธํ๊ฒ ๋๊ณ , ์ธ์ฆ ๊ฐ์ฒด๊ฐ ์๋ค๋ฉด AuthenticationException ์ฆ, ์ธ์ฆ ์์ธ๋ฅผ ๋ฐ์ ์ํค๊ฒ ๋์. ํด๋น Exception์ ExceptionTranslationFilter๊ฐ ๋ฐ์ ํ์ ์์
์๋ฅผ ๋ค์ด Login Page๋ก ๋ค์ ์ด๋์ ์ํค๋ ๋ฑ์ ์์
์ ์ฒ๋ฆฌํ๊ฒ ๋์.
์ธ์ฆ ๊ฐ์ฒด๋ SecurityContext ์์ ์ธ์ฆ์ ๋ฐ์์ ๋, ์ ์ฅ์ด ๋๋ ๊ฒ์ ์ฐ๋ฆฌ๋ ๊ณต๋ถํ์ด์.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํด๋น ์ด์ฉ์๊ฐ ์ธ์ฆ์ ๋ฐ์๋ค๋ฉด ์ธ์ฆ ๊ฐ์ฒด๋ ์กด์ฌํ๊ฒ ๋ ๊ฒ์ด์์.
์ธ์ฆ ๊ฐ์ฒด๊ฐ ์กด์ฌํ๋ค๋ฉด SecurityMetadataSource ๊ฐ์ฒด์์ ์ด์ฉ์๊ฐ USER๋ผ๋ URI๋ก ์ ๊ทผํ์ ๋, ํด๋น URI์ ์ ๊ทผ ๊ฐ๋ฅ ๊ถํ์ด ์์ ๊ฑฐ๊ณ , ํด๋น URI์ ๋ฑ๋ก๋ ๊ถํ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ์ญํ ์ ํฉ๋๋ค.
์ฆ, ์ด์ฉ์๊ฐ ์์ฒญํ URI์ ํ์ํ ๊ถํ ์ ๋ณด ์กฐํ๋ฅผ ํ ๋ค ์ ๋ฌํ๋ ์ญํ ์ ํฉ๋๋ค.
๋ง์ฝ ํด๋น URI์ ๊ถํ ์ ๋ณด๊ฐ Null์ผ ๊ฒฝ์ฐ ๊ถํ ์ฌ์ฌ๋ฅผ ํ์ง ์๊ณ , ์์์ ์ ๊ทผ์ ํ์ฉ ์์ผ์ค๋๋ค.
URI์ ๊ถํ ์ ๋ณด๊ฐ ์๋ค๋ฉด SecurityMetadataSource๋ ํด๋น URI์ ๊ถํ ์ ๋ณด๋ฅผ AccessDecisionManager์๊ฒ ์ ๋ฌ์ ํด์ฃผ๊ฒ ๋์.
AccessDecisionManager(์ต์ข
์ฌ์ ๊ฒฐ์ ์)๋ ์ธ๊ฐ ์ฒ๋ฆฌ๋ฅผ ํ๊ฒ ๋๋๋ฐ, ๋ด๋ถ์ ์ผ๋ก AccessDecisionVoter(์ฌ์์) ๊ฐ์ฒด์ ์ธ๊ฐ ๊ด๋ จ ๋น๊ต๋ฅผ ์์ฒญํ๊ฒ ๋ฉ๋๋ค.
AccessDecisionVoter๋ ํด๋น URI์ ์ด์ฉ์๊ฐ ์ ๊ทผํ ๊ถํ์ด ์๋์ง ์ฌ๋ถ๋ฅผ ํ๋จํ๊ณ , ์น์ธ ํน์ ๊ฑฐ๋ถ์ ๋ํ ์์ฌ ๊ฒฐ์ ์ ํ์ฌ AccessDecisionManager์๊ฒ ์ ๋ฌํด ์ฃผ๊ฒ ๋ฉ๋๋ค.
AccessDecisionManager๋ ์ ๋ฌ ๋ฐ์ ๊ฒฐ๊ณผ๊ฐ์ ๊ฐ์ง๊ณ , ์ต์ข
์ ์ผ๋ก ํด๋น ์ด์ฉ์๊ฐ ํด๋น URI์ ์ ๊ทผ์ ํ์ฉํ ์ง ๋ง์ง๋ฅผ ํ๋จํ๊ฒ ๋๋๋ฐ, ์ ๊ทผ์ ๊ฑฐ๋ถํ๊ฒ ๋๋ฉด AccessDeniedException์ ํฐํธ๋ฆฌ๊ฒ ๋๊ณ , ์ด Exception์ ExceptionTranslationFilter์๊ฒ ์ ๋ฌํ๊ฒ ๋ฉ๋๋ค.
์ ๊ทผ์ด ํ์ฉ๋์๋ค๋ฉด? ์ด์ฉ์๋ ์์์ ์ ๊ทผ์ ํ ์ ์๊ฒ ๋ ๊ฑฐ์์.
์ธ๊ฐ ์ฒ๋ฆฌ ๊ณต๋ถ๋ฅผ ์์ ์์ ๊ฐ์ด SecurityConfig CODE๋ฅผ ์์ฑํด ์ฃผ์์ด์.
/user ๋ผ๋ URI์ ์ ๊ทผ ๊ฐ๋ฅํ ๊ถํ์ USER ์ด๊ณ , ๋๋จธ์ง๋ ๋ชจ๋ ์ ๊ทผ ๊ฐ๋ฅํ๊ฒ ์ฒ๋ฆฌ๊ฐ ๋์์ต๋๋ค.
USER ๊ถํ์ ๊ฐ์ง user ๊ณ์ ์ผ๋ก ์ธ์ฆ์ ๋ฐ๊ณ , /user๋ก ์ ๊ทผํ์ ๋, ์์ ๊ฐ์ด ์ ์ ์ ๊ทผ ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ด์.
ํ์ง๋ง, /admin/pay๋ ADMIN ๊ถํ๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ฐ, user ๊ณ์ ์ผ๋ก ์ ๊ทผ์ ํ๋ ค๊ณ ํ์ ๋ ์์ ๊ฐ์ด ์ ๊ทผ์ด ๋ถ๊ฐํ ๊ฒ์ ํ์ธํ ์ ์์ด์.
๐ก ์ฐธ๊ณ ์ฌํญ
403 Forbidden
HTTP 403 Forbidden ํด๋ผ์ด์ธํธ ์ค๋ฅ ์ํ ์๋ต ์ฝ๋๋ ์๋ฒ์ ์์ฒญ์ด ์ ๋ฌ๋์์ง๋ง, ๊ถํ ๋๋ฌธ์ ๊ฑฐ์ ๋์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
๐ฝ ์ธ๊ฐ ๊ฒฐ์ ์ฌ์์
์ต์ด FilterSecurityInterceptor(๊ถํ ์ฒ๋ฆฌ ๋ด๋น์)๊ฐ AccessDecisionManager์๊ฒ ์ธ๊ฐ ์ฒ๋ฆฌ์ ๋ํ ์์
์ ์์ํฉ๋๋ค. ์์ํ ๋, authentication - ์ธ์ฆ ์ ๋ณด, object(FilterInvocation) - ์์ฒญ ์ ๋ณด, configAttributes - ๊ถํ ์ ๋ณด๋ฅผ ํจ๊ป ๋๊ฒจ์ค๋๋ค.
AccessDecisionManager๋ ์์ ์ด ๋ณด์ ํ Voter๋ค์๊ฒ authentication - ์ธ์ฆ ์ ๋ณด, object(FilterInvocation) - ์์ฒญ ์ ๋ณด, configAttributes - ๊ถํ ์ ๋ณด๋ฅผ ์ ๋ฌํ๋ฉด์ ๊ฐ Voter๋ค ์ฆ, AccessDecisionVoter์๊ฒ ๊ถํ ํ๋จ ์ฌ์ฌ๋ฅผ ์์ํฉ๋๋ค.
๊ฐ๊ฐ์ AccessDecisionVoter ๋งค๊ฐ ๋ณ์๋ก ์ ๋ฌ๋ ๊ฐ๋ค์ ๊ฐ์ง๊ณ , ์ ๊ทผ ์ฌ๋ถ๋ฅผ ํ๋จํ๊ณ , ์ ๊ทผ ํ์ฉ(ACCESS_GRANTED), ์ ๊ทผ ๊ฑฐ๋ถ(ACCESS_DENIED), ์ ๊ทผ ๋ณด๋ฅ(ACCESS_ABSTAIN) ๊ฐ์ ๋ฐํํ๊ฒ ๋ฉ๋๋ค.
AccessDecisionManager๋ ๋ฐํ๋ ๊ฒฐ๊ณผ๊ฐ์ ๊ฐ์ง๊ณ , ์ด์ฉ์์ ์์ฒญ์ ์ ๊ทผ์ ํ์ฉํ ์ง ๋ง์ง๋ฅผ ๊ฒฐ์ ํ๊ฒ ๋ฉ๋๋ค.
์ต์ข
์ ์ผ๋ก ์น์ธ์ด ํ๋จ๋๋ฉด FilterSecurityInterceptor์๊ฒ ACCESS_GRANTED ๊ฐ์ ๋ฐํํ๊ณ , ๊ฑฐ๋ถ๊ฐ ๋๋ฉด
AccessDeniedException์ ํฐํธ๋ ค ExceptionTranslationFilter์๊ฒ ์ ๋ฌํ๊ฒ ๋ฉ๋๋ค.
๐ฆ AccessDecisonManager
1. ์ธ์ฆ ์ ๋ณด, ์์ฒญ ์ ๋ณด, ๊ถํ ์ ๋ณด(๋งค๊ฐ ๋ณ์๋ก ์ ๋ฌ)๋ฅผ ์ด์ฉ, ์ด์ฉ์์ ์์ ์ ๊ทผ ์ฌ๋ถ๋ฅผ ์ต์ข
๊ฒฐ์ ํ๋ ์ฃผ์ฒด.
2. ์ฌ๋ฌ Voter ๋ค์ ๊ฐ์ง ์ ์์ผ๋ฉฐ, Voter ๋ค๋ก๋ถํฐ ์ ๊ทผ ์ฌ๋ถ(ํ์ฉ, ๊ฑฐ๋ถ, ๋ณด๋ฅ)์ ๊ฐ์ ๋ฐํ๋ฐ๊ณ , ํ๋จ ๋ฐ ๊ฒฐ์ .
3. ์ต์ข
์ ๊ทผ ๊ฑฐ๋ถ ์ Exception ๋ฐ์.
4. ์ ๊ทผ ๊ฒฐ์ ์ธ๊ฐ์ง ์ ํ. AccessDecisonManager๋ Interface๋ก ์๋ 3๊ฐ์ง ๊ตฌํ์ฒด ๋ณด์ .
• AffirmativeBased : ์ฌ๋ฌ๊ฐ์ Voter Class ์ค ํ๋๋ผ๋ ์ ๊ทผ ํ๊ฐ๋ก ๊ฒฐ๋ก ๋๋ฉด ์ ๊ทผ ํ๊ฐ ์ฒ๋ฆฌ.
• ConsensusBased : ๋ค์ํ(ํฌํ ๋ฐฉ์ - ์น์ธ ๋ฐ ๊ฑฐ๋ถ)์ ์ํด ์ต์ข
๊ฒฐ์ ํ๋จ.
- ํฌํ์์ ๊ฒฐ๊ณผ๊ฐ ๋์ผํ ๊ฒฝ์ฐ ๊ธฐ๋ณธ์ ์ ๊ทผ ํ๊ฐ์ด๋, allowIfEqualGrantedDeniedDecisions๋ฅผ false๋ก ์ค์ ํ
๊ฒฝ์ฐ ์ ๊ทผ ๊ฑฐ๋ถ๋ก ์ฒ๋ฆฌ.
• UnanimousBased : ๋ชจ๋ Voter๊ฐ ๋ง์ฅ์ผ์น๋ก ์ ๊ทผ์ ์น์ธํด์ผํ๋ฉฐ, ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ์ ๊ทผ ๊ฑฐ๋ถ.
๐ฆ AccessDecisonVoter
1. ํ๋จ์ ์ฌ์ฌํ๋ ์์. ์ด์ฉ์์ ์์ฒญ์ ์ ๊ทผ ์ฌ๋ถ๋ฅผ ํ๋จ.
2. Voter๊ฐ ๊ถํ ๋ถ์ฌ ๊ณผ์ ์์ ํ๋จํ๋ ์๋ฃ.
• Authentication - ์ธ์ฆ ๊ฐ์ฒด ์ฆ, ์ธ์ฆ ์ ๋ณด(USER).
• FilterInvocation - ์์ฒญ ์ ๋ณด (antMatcher("/user)).
• ConfigAttributes - ๊ถํ ์ ๋ณด (hasRole("USER")).
3. ๊ฒฐ์ ๋ฐฉ์
• ACCESS_GRANTED : ์ ๊ทผ ํ์ฉ(1).
• ACCESS_DENIED : ์ ๊ทผ ๊ฑฐ๋ถ (-1).
• ACCESS_ABSTAIN : ์ ๊ทผ ๋ณด๋ฅ (0).
- Voter๊ฐ ํด๋น Type์ ์์ฒญ์ ๋ํด ๊ฒฐ์ ์ ๋ด๋ฆด ์ ์๋ ๊ฒฝ์ฐ.
๐ฝ Spring Security Filter ๋ฐ ์ํคํ ์ฒ ์ ๋ฆฌ
์ง๊ธ๊น์ง ๊ณต๋ถํ ๋ด์ฉ์ ํ๋ฒ ์ ๋ฆฌํ๋ ์๊ฐ์ ๊ฐ์ ธ๋ณผ๊ฒ์.
๊ฒ์์์ผ๋ก ํ์๋ ๊ฐ Filter๋ค์ ๊ธฐ์ค์ผ๋ก ์์ชฝ์ Spring Security๊ฐ ์ด๊ธฐํํ๋ ๊ณผ์ ์ด๊ณ , ์๋์ชฝ์ ๊ฐ Filter๋ค์ด ์ด๋ค ์์
์ ํ๋์ง ๋ํ๋ด๊ณ ์๋ ๋ถ๋ถ์ด์์.
์ต์ด Spring Security๊ฐ ์ด๊ธฐํ ๋ ๋, ๊ฐ๋ฐ์๊ฐ ์์ฑํ SecurityConfig (WebSecurityConfigurerAdapter extens) Class๋ค์์ ์ฌ๋ฌ๊ฐ์ง API๋ฅผ ์ ์ํ๊ณ , ๊ฐ๊ฐ์ API๋ค์ด ์์ฒญ์ ๋ฐ์ ์ฒ๋ฆฌ๋ฅผ ํ๊ฒ ๊ตฌ์ฑ์ ํฉ๋๋ค.
Spring Security๊ฐ ์ด๊ธฐํ ๋ ๋, SecurityConfig์ ์ค์ ํ ๋ด์ฉ๊ณผ ๊ตฌ์ฑ๋๋ก ๊ฐ๊ฐ์ Filter๋ค์ ์์ฑํ๊ฒ ๋ฉ๋๋ค.
์ค์ ๋ก Filter๊ฐ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ์ญํ ์ ํ๋ฉฐ, ์ด Filter๋ค์ HttpSecurity๊ฐ ์์ฑํฉ๋๋ค.
์์ ๊ทธ๋ฆผ์ฒ๋ผ ๋๊ฐ์ SecurityConfig๋ฅผ ๋ง๋ค๊ฒ ๋๋ฉด ๊ฐ๋ฐ์๊ฐ ์์ฑํ๋๋ก API ์ค์ ๋ค์ด ๋ง๋ค์ด์ง๊ฒ ๋ฉ๋๋ค.
ํด๋น Filter ๋ชฉ๋ก๋ค์ WebSecurity ๊ฐ์ฒด์ ์ ๋ฌ์ด ๋ฉ๋๋ค.
WebSecurity๋ FilterChainProxy Bean ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ฒ ๋๋๋ฐ, ์ด ๋, ์์ฑ์์ filter ๋ชฉ๋ก๋ค์ ์ ๋ฌํ๊ฒ ๋์.
FilterChainProxy๋ ์ ๋ฌ ๋ฐ์ ๊ฐ๊ฐ์ Filter๋ค์ ๊ฐ์ง๊ณ ์๊ฒ ๋๊ฒ ์ต๋๋ค.
DelegatingFilterProxy ๊ฐ์ฒด๋ Sevlet Filter์ธ๋ฐ, Spring Secutiry๊ฐ ์ด๊ธฐํ ๋ ๋, ์ด๋ฏธ FilterChainProxy๋ Bean ๊ฐ์ฒด๋ก ์์ฑ๋ ์ํ์ด๊ณ , springSecurityFilterChain์ด๋ผ๋ ์ด๋ฆ์ ๊ฐ์ง Bean ๊ฐ์ฒด๋ฅผ ์ฐพ๊ฒ ๋๋๋ฐ, ๊ทธ ์น๊ตฌ๊ฐ ๋ฐ๋ก FilterChainProxy์์.
DelegatingFilterProxy๋ ์ด์ฉ์์ ์์ฒญ์ด ๋ค์ด์์ ๋, ์์ฒญ์ ๋ฐ์ springSecurityFilterChain์ด๋ฆ์ ๊ฐ์ง Bean ๊ฐ์ฒด ์ฆ, FilterChainProxy์๊ฒ ํด๋น ์์ฒญ ์ฒ๋ฆฌ๋ฅผ ์์ํ๊ฒ ๋ฉ๋๋ค.
์ฌ๊ธฐ๊น์ง๊ฐ Spring Security๊ฐ ์ด๊ธฐํ ๋ ๋ ์ผ์ด๋๋ ์ผ์ด์์.
์ด๊ธฐํ ๊ณผ์ ์ด ๋๋๊ณ , ์ด์ฉ์๊ฐ ์ธ์ฆ ์์ฒญ์ ๋ณด๋ด๊ฒ ๋ฉ๋๋ค.
DelegatingFilterProxy๊ฐ ์ต์ด ์ด์ฉ์ ์ธ์ฆ ์์ฒญ์ ๋ฐ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฐ ๋ค FilterChainProxy์๊ฒ ํด๋น ์์ฒญ์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ์์ํ๊ฒ ๋ฉ๋๋ค.
FilterChainProxy๋ ์์์๋ ์ธ๊ธํ๋ฏ์ด ์ด๊ธฐํ ๊ณผ์ ์ด ์ผ์ด๋๊ฒ ๋๋ฉด Filter ๋ชฉ๋ก๋ค์ ๊ฐ์ง๊ณ ์๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ , ๊ฐ๊ฐ์ Filter๋ค์๊ฒ ์ฐจ๋ก๋๋ก ํด๋น ์์ฒญ ์ ๋ณด๋ฅผ ๋ณด๋ด๋ฉด์ ํธ์ถ์ ํ๊ฒ ๋ฉ๋๋ค.
๊ฐ๊ฐ์ Filter๋ค์ Chain ํ์์ผ๋ก ์๊ธฐ ์์ ์ ๊ณผ์
์ด ๋๋๋ฉด ๋ค์ Filter์๊ฒ ์์
์ฒ๋ฆฌ๋ฅผ ์์ํ๊ฒ ๋ฉ๋๋ค.
์ต์ด SecurityContextPersistenceFilter๊ฐ ํธ์ถ์ด ๋ฉ๋๋ค.
SecurityContextPersistenceFilter๋ HttpSessionSecurityContextRepository๋ฅผ ๊ฐ์ง๊ณ ์์ด์.
HttpSessionSecurityContextRepository๋ SecurityContext ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , SecurityContext๋ฅผ Session์ ์ ์ฅํ๊ณ ,์ ์ฅ๋ SecurityContext๋ฅผ ์ด๊ธฐํ ํ๊ณ ,์ฐธ์กฐ ํ๋ ์ญํ ์ ํ๊ณ ์์ด์.
loadContext()์์๋ ์ด ์ด์ฉ์๊ฐ ์ด์ ์ SecurityContext ๊ฐ์ฒด๊ฐ ์์ฑ๋์ด Session์ ์ ์ฅํ ์ด๋ ฅ์ด ์๋์ง ํ์ธ์ ํฉ๋๋ค.
์ธ์ฆ ๊ณผ์ ์ด๊ธฐ ๋๋ฌธ์ ์ด์ฉ์์ ๋ํ Session ์ ์ฅ ์ด๋ ฅ์ ์์๊ฑฐ์์. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ Create SecurityContext๋ฅผ ํ์ฌ ์๋ก์ด SecurityContext ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ฒ ๋ฉ๋๋ค.
์ธ์ฆ ์์ฒญ ์ด์ฉ์, ์ต๋ช
์ด์ฉ์์ ๊ฒฝ์ฐ SecurityContext ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด SecurityContextHolder ์์ ์ ์ฅํ๋ ์ญํ ์ SecurityContextPersistenceFilter๊ฐ ๋ด๋นํฉ๋๋ค.
๊ทธ๋ฐ ๋ค ๋ค์ Filter๋ก ์์
์์๊ฐ ๋์ด๊ฐ๋๋ค.
Logout Filter๋ Logout์ ์ฒ๋ฆฌํ๋ Filter์ธ๋ฐ, ํ์ฌ๋ ์ธ์ฆ ์์ฒญ์ด์ง Logout ์์ฒญ์ด ์๋๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ๋ค์ Filter๋ก ์์
์์๋ฅผ ๋๊ฒจ์ค๋๋ค.
UsernamePasswordAuthenticationFilter๊ฐ Form ์ธ์ฆ ์ฒ๋ฆฌ๋ฅผ ํ๋ ์ธ์ฆ Filter์ธ๋ฐ, ์ต์ด Authentication (์ธ์ฆ ๊ฐ์ฒด)๋ฅผ ๋ง๋ค์ด ์ด์ฉ์๊ฐ ์์ฒญ ๋ ๋ณด๋ธ ID, Password๊ฐ์ ์ ์ฅํฉ๋๋ค.
๊ทธ๋ฐ ๋ค AuthenticationManager ์ธ์ฆ ์ฒ๋ฆฌ๋ฅผ ์์ํ๊ฒ ๋๊ณ , AuthenticationManager๋ ๋ค์ AuthenticationProvider์๊ฒ ์ธ์ฆ ์ฒ๋ฆฌ ์์
์ ์์ํฉ๋๋ค.
AuthenticationProvider๋ UserDetailsService์ ๊ฐ์ Class๋ฅผ ์ด์ฉํ์ฌ ID, Password๋ฅผ ๊ฒ์ฆํฉ๋๋ค.
์ธ์ฆ์ด ์๋ฃ๊ฐ ๋๋ฉด SecurityContextHolder์์ SecurityContext ์์ Authentication์ ์ ์ฅํ๋๋ฐ, ์ด ๋, ์ด์ฉ์์ ID, Password, ๊ถํ ๋ชฉ๋ก๊ณผ ์ธ์ฆ ์ฌ๋ถ ๊ฐ ๋ฑ์ ์ ์ฅํฉ๋๋ค.
SecurityContextPersistenceFiler๊ฐ ์ฒ์์ SecurityContextHolder์ SecurityContext ๊ฐ์ฒด๋ฅผ ๋ง๋ค์๋๋ฐ, ์ด๋ฅผ ๊บผ๋ด์์ ์ ์ฅํ๋ ๊ฒ์ด์์.
๊ธฐ์ตํด์ผ ํ๋ ๊ฒ์ UsernamePasswordAuthenticationFilter๊ฐ ์ธ์ฆ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๊ฐ ๋๋ฉด ๋ฐ๋ก SessionManagementFilter๊ฐ ๋์ํ์ฌ์ ConcurrentSession ๋์ Session ์ ์ ์ฌ๋ถ๋ฅผ ํ์ธํ๊ฒ ๋๋๋ฐ, ์ด์ ์ธ์ฆ ์ฒ๋ฆฌ๊ฐ ์์๋์ง ํ์ฉ๋๋ Session ๊ฐ์๊ฐ ์ผ๋ง์ธ์ง๋ฅผ ํ์ธํ์ฌ ๋ง์ฝ ๋์ ์ ์ ๊ฐ๋ฅ ๊ฐ์๊ฐ ํ ๊ฐ๋ผ๊ณ ์ค์ ํ๋ค๊ณ ๊ฐ์ ํ์ ๋, ์ด ์ ์ ์ธ์ฆ์ด ๋์ง ์์๋ค๋ฉด ๋ณ๋ค๋ฅธ ์กฐ์น์์ด ํต๊ณผ๊ฐ ๋๊ณ , SessionFixation์ ํตํด ์ธ์ฆ์ ์ฑ๊ณตํ ์์ ์ ์๋กญ๊ฒ Cookie๊ฐ ๋ฐ๊ธ๋๊ฒ ๋ฉ๋๋ค.
์ธ์ฆ์ ์๋ํ๊ธฐ ์ ์ Cookie๋ ์ฌ๋ผ์ง๊ฒ ๋๊ณ , ๋ค์ Session๊ณผ Cookie๊ฐ ์์ฑ, ๋ฐ๊ธ๋๋๋ก ์ฒ๋ฆฌ๊ฐ ๋ฉ๋๋ค.
Register SessionInfo ์ด์ Session ์ ๋ณด๊ฐ Server์ ํ๋ ๋ฑ๋ก๋๊ฒ ๋๋ ๊ฒ๋๋ค.
์ด ์ฒ๋ฆฌ๊ฐ ์ธ์ฆ ์ฒ๋ฆฌ๊ฐ ์ผ์ด๋ ๋ ์ผ์ด๋๋ ์์
์ด์์.
์ธ์ฆ์ด ์ฑ๊ณต๋ ์ดํ SuccessHandler๊ฐ ํ์ ์์
์ ํ ๋, ์ธ์ฆ์ ์ฑ๊ณตํ๊ฒ ๋๋ฉด ์ด์ฉ์๊ฐ ์์ฒญํ Page๋ก ์ด๋ํ๊ฒ ๋์ด ์์ต๋๋ค.
์ด ๋, SecurityContextPersistenceFilter๊ฐ Client์๊ฒ ์๋ต์ ๋ณด๋ด๊ธฐ ์ ์ Session์ SecurityContext ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋๋ก ์ฒ๋ฆฌ๋ฅผ ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค Clear SecutiryContext๋ฅผ ์ด์ฉํ์ฌ SecurityContext ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํ ํ๋ ์์
์ ์งํํด์.
์ฌ๊ธฐ๊น์ง๊ฐ ์ธ์ฆ์ ์์ฒญํ์ ๋, ์ผ์ด๋๋ ์์
์ด์์.
์ด๋ฒ์๋ ์ด์ฉ์๊ฐ ์์ฒญํ Page๋ก ์ด๋๋ ๋, ์ด๋ค ์ผ์ด ๋ฐ์ํ๋์ง ์์๋ณผ๊ฒ์.
DelegatingFilterProxy๊ฐ ์ต์ด ๊ทธ ์์ฒญ์ ๋ฐ๊ฒ ๋๊ณ , FilterChainProxy์๊ฒ ํด๋น ์์ฒญ์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ์์ํ๊ฒ ๋ฉ๋๋ค.
FilterChainProxy๋ ์์ ์๊ฒ ๋ฑ๋ก๋ Filter๋ค์๊ฒ ์ฐจ๋ก๋๋ก ์์ฒญ์ ๋ํ ์์
์ฒ๋ฆฌ๋ฅผ ์์ํ๊ฒ ๋ฉ๋๋ค.
SecurityContextPersistenceFilter๊ฐ ๋ค์ ํธ์ถ์ด ๋๋๋ฐ, loadContext()์์ ์์ฒญ์ ๋ณด๋ธ ์ด์ฉ์๊ฐ ์ด์ฉ์ Session์ SecurityContext ๊ฐ์ฒด๋ฅผ ์ ์ฅํ ์ ์ด ์๋์ง ์๋์ง๋ฅผ ํ๋จํฉ๋๋ค.
ํ์ฌ๋ ์ธ์ฆ์ ์ฑ๊ณตํ๊ธฐ ๋๋ฌธ์ Session์ SecurityContext๊ฐ ์ ์ฅ์ด ๋์ด ์๋ ์ํ์์.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์๋ก์ด SecurityContext ๊ฐ์ฒด๋ ์์ฑํ์ง ์์ต๋๋ค.
๊ทธ๋ฐ ๋ค ๋ค์ Filter๋ก ์ด๋ํ๋๋ฐ, ์ด๋ฒ์๋ Logout ์์ฒญ์ด ์๋๊ธฐ ๋๋ฌธ์ ๋ ๋ค์ ๋ค์ Filter๋ก ์์
์ด ์ด๋๋ฉ๋๋ค.
UsernamePasswordAuthenticationFilter ์ญ์๋ ์ธ์ฆ ์์ฒญ์ด ์๋๊ธฐ ๋๋ฌธ์ ๋ ๋ค์ ๋ค์ Filter๋ก ์์
์ด ์ด๋๋ฉ๋๋ค.
์ด๋ฒ์๋ ConcureentSessionFilter(๋์์ Session ์ ์ด ์ฒ๋ฆฌ)๊ฐ ๋์ํ๊ฒ ๋์.
์ด ์ ์ ์ธ์ฆ์ ๋ฐ์์ ์ด ์๋์ง๋ฅผ ํ์ธํ๋๋ฐ, ์ด ์ ์ ์ธ์ฆ์ ๋ฐ์ ์ ์ด ์๊ธฐ ๋๋ฌธ์ ๋ค์ Filter๋ก ์์
์ด ์ด๋๋ฉ๋๋ค.
์ด๋ฒ์๋ RememberMeAuthenticationFilter๋ฅผ ์์๋ณผ๊ฒ์.
ํ์ฌ ์์ฒญ ์ด์ฉ์๊ฐ Session์ด ๋ง๋ฃ ํน์ ๋ฌดํจํ ๋์์ ๋, Session์์ SecurityContext ๊ฐ์ฒด ์์ Authentication ์ธ์ฆ ๊ฐ์ฒด๊ฐ Null์ผ ๊ฒฝ์ฐ ํธ์ถ์ด ๋ฉ๋๋ค.
์์ฒญ ์ด์ฉ์๊ฐ Request Header์ remember-me Cookie๋ฅผ ๋ด์ ๋ณด๋๋ค๋ฉด ์ธ์ฆ ์ฒ๋ฆฌ๋ฅผ ์๋ํ๊ฒ ๋ฉ๋๋ค.
AnonymousAuthenticationFilter๋ก ์์
์ด ๋์ด๊ฐ๊ฒ ๋๋๋ฐ, ์ธ์ฆ ํน์ ๊ถํ ์์ด ์ด๋ค ์์์ ๋ฐ๋ก ์ ์์ ์๋ํ ๊ฒฝ์ฐ ๋์ํ๊ฒ ๋ฉ๋๋ค.
AnonymousAuthenticationFilter๋ AnonymousAuthenticationToken ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด SecurityContext ๊ฐ์ฒด ์์ ์ ์ฅํ๋ ์ญํ ์ ํฉ๋๋ค.
SessionManagementFilter๋ ์ธ์ฆ์ ๋ฐ์ ๋น์ ์์์ ๊ฐ์ด ์ฒ๋ฆฌ๋๋ค๊ณ ์ธ๊ธ์ ํ๋๋ฐ, ๋์ ์กฐ๊ฑด์ ์์ฒญ ์ด์ฉ์ Request Header์ Session ์์ SecurityContext๊ฐ ์๊ฑฐ๋, Null์ผ ๊ฒฝ์ฐ ๋์ํด์.
์ด์ฉ์์ Session์ด ๋ง๋ฃ๋์์ ๊ฒฝ์ฐ์ผํ
๋ฐ, ๋ค๋ฅธ ์ฐํ์ ๋ฐฉ๋ฒ์ผ๋ก ์ ๊ทผํ๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํ๊ฒ ๋ฉ๋๋ค.
ExceptionTranslationFilter์ FilterSecurityInterceptor๊ฐ ์ธ์ฆ ์ดํ ์์ ์์ฒญ์ด ๋ค์ด์์ ๋, ๊ฐ์ฅ ๋ง์ ์ญํ ์ ํ๋ ์น๊ตฌ๋ค์ด์์.
ExceptionTranslationFilter๋ ์ธ์ฆ ํน์ ์ธ๊ฐ์ ๋ํด ๋ฌธ์ ๊ฐ ์๊ฒจ Exception์ด ํฐ์ก์ ๊ฒฝ์ฐ ๋์ํ๊ฒ ๋๋๋ฐ,
try catch๋ก ๊ฐ์ผ chain.dofilter๋ฅผ ํตํด ๊ทธ ๋ค์ Filter์ธ FilterSecurityInterceptor๋ฅผ ํธ์ถํด ๋ฒ๋ ค์.
FilterSecurityInterceptor(์ธ๊ฐ ์ฒ๋ฆฌ)๋ ๋จผ์ ์์ฒญ ์ด์ฉ์์ Request์ ์ธ์ฆ ๊ฐ์ฒด(Authentication)์ด ์๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค. ์์ผ๋ฉด AuthenticationException์ ํฐํธ๋ฆฌ๊ณ , ExceptionTranslationFilter์๊ฒ ์ ๋ฌํฉ๋๋ค.
๊ทธ ๋ค์์ ์ธ๊ฐ ์ฒ๋ฆฌ๋ฅผ ํ๋๋ฐ, ์ด๋ฅผ AccessDecisionManager์๊ฒ ์์ํ๊ฒ ๋ฉ๋๋ค.
AccessDecisionManager๋ ๋ด๋ถ์ ์ผ๋ก AccessDecisionVoter๋ฅผ ๊ฐ์ง๊ณ , ์ธ๊ฐ ์ฒ๋ฆฌ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๊ณ , ๊ฒฐ๊ณผ๊ฐ์ FilterSecurityInterceptor์๊ฒ ๋ฐํํฉ๋๋ค.
๋ง์ฝ ์ธ๊ฐ ์ฒ๋ฆฌ์ ๋ฌธ์ ๊ฐ ์๋ค๋ฉด AccessDeniedException์ FilterSecurityInterceptor๊ฐ ํฐํธ๋ฆฌ๊ฒ ๋๊ณ , ์ด๋ฅผ ExceptionTranslationFilter์๊ฒ ์ ๋ฌํฉ๋๋ค.
ExceptionTranslationFilter๋ ์ด ๋๊ฐ์ง Exception์ ์ฒ๋ฆฌํ๋ ์ญํ ์ ํฉ๋๋ค.
์ด๋ฒ์๋ ์ด๋ฏธ ์ธ์ฆ์ด ๋์ด ์๋ ์ํ์์ ๋ ๋ค๋ฅธ ๋ธ๋ผ์ฐ์ ๋ฑ์ผ๋ก ์ธ์ฆ์ ์์ฒญํ ๋ ๋ฐ์ํ๋ ์์
์ ๋ํด ๋ค์ ํ๋ฒ ๊ณต๋ถํด ๋ณผ๊ฒ์.
์ด์ฉ์๊ฐ ์ธ์ฆ ์์ฒญ์ ๋ณด๋ด๊ฒ ๋๊ณ , DelegatingFilterProxy๊ฐ ์ต์ด ์์ฒญ์ ๋ฐ์ FilterChainProxy์๊ฒ ์์ฒญ ์ฒ๋ฆฌ๋ฅผ ์์ํ๊ณ , FilterChainProxy๋ Filter ๋ชฉ๋ก์ ์๋ Filter๋ค์๊ฒ ์์
์ ์์ ํฉ๋๋ค.
SecurityContextPersistenceFilter, LogoutFilter, UsernamePasswordAuthenticationFilter๋ ์ฒซ๋ฒ์งธ ์ด์ฉ์๊ฐ ์ธ์ฆ ์์ฒญํ์ ๋์ ๋์ผํ๊ฒ ์์
์ด ์ฒ๋ฆฌ ๋๊ณ , ์ธ์ฆ์ ์ผ๋จ ์ฑ๊ณต ์ฒ๋ฆฌ๊ฐ ๋ฉ๋๋ค. ๊ทธ๋์ SecurityContextHolder ์์ SecurityContext ๊ฐ์ฒด ์์ Authentication ์ธ์ฆ ๊ฐ์ฒด๊ฐ ๋ด๊ธฐ๊ฒ ๋๊ณ , ์ด๋ฅผ Session์ ์ ์ฅํ๋ ์ฒ๋ฆฌ๊น์ง ์๋ฃ ํฉ๋๋ค. ์ด ๋, SessionManagementFilter์ ConcurrentSession์์ ๋์ผ ๊ณ์ ์ Session์ ํ๋๋ง ์์ฑํ๋๋ก ํ์ฉํ๋๋ฐ, ConcurrentSession์์ ๋ ๊ฐ์ง ์ ๋ต์ ์ํด ์ฒ๋ฆฌ๊ฐ ๋ฉ๋๋ค.
์ฒซ๋ฒ์งธ๋ ํ์ฌ ์ด์ฉ์ ์ธ์ฆ ์๋๋ฅผ ์ฐจ๋จ (SessionAuthenticationException)์ ํ๊ฒ ๋๊ณ ,
๋๋ฒ์งธ๋ ์ด์ ์ด์ฉ์ Session์ ๋ง๋ฃ (Session.expireNow) ์ฒ๋ฆฌ๋ฅผ ํ๊ฒ ๋ฉ๋๋ค.
๋ง์ฝ ๋๋ฒ์งธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค๋ฉด ํด๋น ์ด์ฉ์๋ ์ฒซ๋ฒ์งธ ์ด์ฉ์์ ๋์ผํ๊ฒ ์์ฒญํ URI๋, ์ ํด์ ธ์๋ URI๋ก ์ด๋ํ๊ฒ ๋ ๊ฑฐ์์. ํด๋น ์์
์ ์ฒซ๋ฒ์งธ ์ธ์ฆ ์ฒ๋ฆฌ์ ๋์ผํ๊ฒ ์ฒ๋ฆฌ๊ฐ ๋์.
์ด ๋, ์ฒซ๋ฒ์งธ ์ธ์ฆ ์ฒ๋ฆฌ๋ฅผ ๋ฐ์ ์ด์ฉ์๊ฐ ํน์ URI ์ ๊ทผ ์์ฒญ์ ๋ณด๋ด๊ฒ ๋๋ฉด ๋ชจ๋ Filter์ ์์
์ ๋์ผํ๊ฒ ์ฒ๋ฆฌํ ๋ค ConcurrentSessionFilter๊ฐ ์์ฒญ์ ๋ฐ๊ฒ ๋ฉ๋๋ค.
์ด ๋, ConcurrentSessionFilter๋ session.isExpired()๋ฅผ ํตํด ํ์ฌ ์ด์ฉ์๊ฐ Session์ด ๋ง๋ฃ๋์๋์ง๋ฅผ ํ๋จํ๊ฒ ๋ฉ๋๋ค.
์ฒซ๋ฒ์งธ ์ด์ฉ์๋ ์ด์ ์ด์ฉ์ Session ๋ง๋ฃ ์ ์ฑ
์ ์ํด Session์ ๋ง๋ฃ๊ฐ ๋์๊ณ , session.isExpired()์ด True๋ก ๋ฐํ๋๊ฒ ๋๋๋ฐ, ๊ทธ๋ ๊ฒ ๋๋ฉด ํด๋น ์ด์ฉ์๋ฅผ ๋ฐ๋ก Logout ์ฒ๋ฆฌ๋ฅผ ํด ๋ฒ๋ฆฌ๊ณ , ์๋ต์ผ๋ก Errror Message๋ฅผ ์ฃผ๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ฉด ๋ค์ Filter๋ฅผ ํธ์ถํ์ง ์๊ณ , ์์
์ ์ข
๋ฃ ๋ฉ๋๋ค.
์ด์ ๊ธ : [Spring Boot] Spring Security Basic - ๊ธฐ๋ณธ API ๋ฐ Filter ์ดํดํธ
๋ค์ ๊ธ : [Stpring Boot] Spring Security ์ค์ ํ๋ก์ ํธ - ์ธ์ฆ ํ๋ก์ธ์ค Form ์ธ์ฆ ๊ตฌํ