Authentication Filter
WebSecurityConfigurerAdapter
WebSecurityCongigurer(SecurityCongigurer)์ ๊ตฌํ์ฒด๋ก ์คํ๋ง ์ํ๋ฆฌํฐ์ ์น ๋ณด์ ๊ธฐ๋ฅ ์ด๊ธฐํ, ์ค์
์ ์ ์ํ๋ ์ถ์ํด๋์ค์ด๋ค.
Custom์ผ๋ก ๋ณด์์ค์ ์ ํ ๋ ์ด๋ฅผ ์์๋ฐ์ ์ ์ํ๋ฉด๋๋ค.
์ด ์ถ์ ํด๋์ค์์๋ ์ธ๋ถ ๋ณด์๊ธฐ๋ฅ์ ์ค์ ํ ์ ์๋ API์ธ HttpSecuriy
๋ฅผ ํตํด ์ธ์ฆ/์ธ๊ฐ API
๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์ด ํด๋์ค๋ฅผ ์์ํ ํด๋์ค๊ฐ ์ฌ๋ฌ๊ฐ๋ผ๋ฉด ๋ณด์๊ธฐ๋ฅ์ ๊ฐ๊ฐ ๋์ํ๊ณ ์ค์ ํด๋์ค ๋ณ๋ก ํํฐ๊ฐ ๊ฐ๊ฐ ์์ฑํ๋ค. FilterChainProxy๊ฐ ๊ฐ ํํฐ๋ค๋ ๋ฐ๋ก ๊ด๋ฆฌํ๋ฉฐ ๊ฐ์ง๊ณ ์๊ณ ์์ฒญ์ ๋ํ url์ ๋งค์นญ๋๋ RequestMathcer์ ๋งค์นญ๋๋ ํํฐ๊ฐ ์๋ํ๋ค.
์ธ์ฆ API
http.formLogin()
http.logout()
http.csrf()
http.SesseionManagement()
http.RememberMe()
http.ExceptionHandling()
http.addFilter()
์ธ๊ฐ API
http.authorizeRequests()
http.andtMathcers(/domain)
http.hasRole(ADMIN)
http.permitAll()
http.authenticated()
http.fullyAuthentication()
http.access(hasRole(USER))
http.denyAll()
application.properties
ํ์ผ์ ํตํด ์ด๊ธฐ ์์ฑ๋๋ ๊ณ์ ์ name๊ณผ password๋ฅผ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๋ค.
Form Login ์ธ์ฆ
HttpSecurity์ API๋ฅผ ์ด์ฉํด ๋ก๊ทธ์ธํ์ด์ง/์ฑ๊ณต,์คํจ์ ๋ฐ๋ฅธ ํ์ด์ง ๋ฑ ํธ๋ค๋งํ ์ ์๋ api๋ฅผ ์ ๊ณตํ๋ค.
http.loginPage("/login") : ์ฌ์ฉ์ ์ ์ ๋ก๊ทธ์ธ ํ์ด์ง
http.defaultSuccessUrl("/home") : ์ฑ๊ณตํ ์ด๋ ํ์ด์ง
http.failureUrl("/login") : ์คํจ ์ด๋ ํ์ด์ง
http.usernameParameter("username") : ์์ด๋ ํ๋ผ๋ฏธํฐ ์ค์ (๊ธฐ๋ณธ ์ ๊ณตํ๋ ํผ์ ํ๋ผ๋ฏธํฐ๋ ์๋ ์ค์ )
http.passwordParameter("passwd") : pw ํ๋ผ๋ฏธํฐ ์ค์ (๊ธฐ๋ณธ ์ ๊ณตํ๋ ํผ์ ํ๋ผ๋ฏธํฐ๋ ์๋ ์ค์ )
http.loginProcessUrl("/login") : ๋ก๊ทธ์ธ ํผ
http.successHandler() : ๋ก๊ทธ์ธ ์ฑ๊ณต ํ ํธ๋ค๋ฌ
http.failureHandler() : ๋ก๊ทธ์ธ ์คํจ ํ ํธ๋ค๋ฌ
UsernamePasswordAuthenticationFilter
LoginForm์ธ์ฆ์ ํด๋น filter๋ฅผ ๊ฑฐ์น๊ฒ ๋๊ณ ํด๋น filter์ ์ํด ์์ฒญ ์ ๋ณด๊ฐ AntPathRequestMatcher(/login)
์ ๋งค์นญ๋๋์ง ํ์ธํ๊ณ ๋งค์นญ์ด ๋์ง ์๋๋ค๋ฉด ๋ค๋ฅธ filter๋ฅผ ์ํํ๋ค. ๋งค์นญ์ด ๋๋ค๋ฉด id์ password๋ฅผ ๋ด์ Authentication๊ฐ์ฒด๋ฅผ ์ด์ฉํด์ AuthenticationManager๊ฐ AuthenticationProvider๋ฅผ ์๊ฒ ์ธ์ฆ์ ์์ํด์ ์ธ์ฆ์ ์ฒ๋ฆฌํ๊ณ ์ฑ๊ณตํ๋ค๋ฉด Authentication์ ์ ๊ทผ๊ถํ์ ๋ถ์ฌํด SecurityContext์ ์ ์ฅํ๊ฒ ๋๋ค.
UsernamePasswordAuthentication์์์ Authentication ์ถ์ ๊ฐ์ฒด๋ UsernamePasswordAuthenticationToken
๋ผ๋ ๊ตฌํ์ฒด๋ฅผ ํตํด ๊ตฌํ์ ํ๊ณ ์๊ณ , AuthenticationMager์ ๊ตฌํ์ฒด๋ก๋ ProviderManger
๊ฐ ๋๋ค. Provider
๊ฐ์ฒด์ authenticate()
๋ฉ์๋๋ด๋ถ์ while()/provider.supports()
๋ฅผ ํตํด ์ ํฉํ Provider๋ฅผ ์ฐพ๊ณ result = provider.authenticate(authentication);
๋ถ๋ถ์์ Provider์๊ฒ ์ธ์ฆ์ ์์ํ๋ค.
RememberMe
์ธ์
์ด ๋ง๋ฃ๋๊ณ ์น ๋ธ๋ผ์ฐ์ ๊ฐ ์ข
๋ฃ๋์ด๋ ์ฌ์ฉ์๋ฅผ ๊ธฐ์ตํ๊ฑฐ๋ Remember-Me
์ฟ ํค์ ๋ํ ์์ฒญ์ ํ์ธํ ํ ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ์ ์ฌ์ฉํด ์ ํจ์ฑ์ ๊ฒ์ฌํด ๋ก๊ทธ์ธ ์ํค๋ ๊ธฐ๋ฅ
SecurityContextHolder์ Authentication์ด null์ผ๋ ์ด ํํฐ๋ฅผ ๊ฑฐ์ณ ๊ธฐ๋ก๋ ์ธ์ฆ์ ๋ณด๊ฐ ์๋์ง ํ๋ณ
Session
๋์ ์ ์ ์
UsernamePasswordAuthenticationFilter -> ConcurrentSessionControleAuthenticationStrategy ๋ฅผ ํตํด Session Count ์ฆ๊ฐ
ChangeSessionIdAuthenticationStrategy์์ session.changeSessionId()๋ฅผ ์ด์ฉํด Session ์์ฑ
ResiterSessionAuthenticationStrategy์ ์ธ์ ์ ๋ณด ๋ฑ๋ก
์ธ์ฆ ์ฑ๊ณต
๋ค๋ฅธ ๋ธ๋ผ์ฐ์ ์์ ๋์ผ ์์ด๋ ์ ์
ConcurrentSessionControlAuthenticaionStrategy์์ session count๋ฅผ ์ฆ๊ฐ ์ํค๊ณ maxSession์์ ๋น๊ต
ํ๋ฆด ๊ฒฝ์ฐ
์ธ์ฆ ์คํจ ์ ๋ต์ผ ๊ฒฝ์ฐ SessionAuthenticationException
์ธ์ฆ ์คํจ
์ธ์ ๋ง๋ฃ ์ ๋ต์ธ ๊ฒฝ์ฐ session.expireNow():์ฒซ๋ฒ์งธ ์ธ์
์ธ์ฆ ์ฑ๊ณต
ChangeSessionIdAuthenticationStrategy์์ session.changeSessionId()์ํ
ResiterSessionAuthenticationStrategy์์ sessino์ ๋ณด ๋ฑ๋ก
์ฒซ๋ฒ์งธ ๋ธ๋ผ์ฐ์ ์์ ์ ์์ ConcurrentSessionFilter์ ์ ์
session ๋ง๋ฃ๋ก ์ ์ ์คํจ
ConcurrentSessionControleAuthenticationStrategy / ChangeSessionIdAuthenticationStrategy / ResiterSessionAuthenticationStrategy
๋ SessionManagementFilter์์ ์์กดํ๋ class
Refernece
์ธํ๋ฐ - Spring Security(์ ์์)
Last updated