[Spring Security] ์ธ์ฆ๊ณผ ์ธ๊ฐ, Spring Security ๊ตฌ์กฐ ๋ฏ์ด๋ณด๊ธฐ, ๋ก๊ทธ์ธ ํ๋ฆ ๋ฏ์ด๋ณด๊ธฐ
์คํ๋ง๋ถํธ๋ก ํ๋ก์ ํธ ๋ง๋๋ ์ค์ธ๋ฐ
ํ์๊ฐ์ , ๋ก๊ทธ์ธ, ๋ก๊ทธ์์ ๊ธฐ๋ฅ ๋ง๋ค๋ ค๋ฉด
์คํ๋ง ์ํ๋ฆฌํฐ๋ฅผ ์์์ผํจ
โ
์ ๊ณต๊ณผ๋ชฉ์ผ๋ก ์ ๋ณด๋ณด์ ๊ณผ๋ชฉ ๋ค์์๋๋ฐ
๊ทธ ๋ ๋์๋ ์ธ์ฆ, ์ธ๊ฐ๊ฐ ์ฌ๊ธฐ์๋ ๋์ด
ใ ใ ใ ใ ใ ใ ใ ใ ใ
์ธ์ฆ๊ณผ ์ธ๊ฐ
authentication, authorization
์ธ์ฆ : ์ฌ์ฉ์์ ์ ์์ ์ ์ฆํ๋ ๊ณผ์ . ๋๊ตฌ์ธ์ง ํ์ธํ๋ ๊ณผ์ ์ ์ธ์ฆ์ด๋ผ๊ณ ํจ
โ
์ธ๊ฐ : ํน์ ๋ถ๋ถ์ ์ ๊ทผ ๊ถํ ๊ฐ๊ณ ์๋ ์๋๊ฐ ํ์ธํ๋ ๊ณผ์ .
(์๋ฅผ ๋ค์ด ๊ด๋ฆฌ์ ํ์ด์ง๋, ๊ด๋ฆฌ์๋ง ๋ค์ด๊ฐ ์ ์์)
โ
-> ์ด ์ผ๋ จ์ ๊ณผ์ ์ ๊ฑ ์ฝ๋๋ก ํ๋ ค๋ฉด ์ค๋๊ฑธ๋ฆผ
--> ์คํ๋ง ์ํ๋ฆฌํฐ ์ฐ๋ฉด ์ฝ๊ฒ ๊ตฌํ ๊ฐ๋ฅ
์คํ๋ง ์ํ๋ฆฌํฐ
Spring Security
์คํ๋ง ์ํ๋ฆฌํฐ๋ ์คํ๋ง ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ๋ณด์์ ๋ด๋นํ๋
์คํ๋ง ํ์ ํ๋ ์์ํฌ์.
๋ณด์ ๊ด๋ จ ์ต์ ๋ค ์ ๊ณต
โ
+ ์ ๋ํ ์ด์ ์ค์ ๋ ์ฌ์ดํธ.
CSRF๊ณต๊ฒฉ, ์ธ์ ๊ณ ์ ๊ณต๊ฒฉ ๋ฐฉ์ดํด์ฃผ๊ณ
์์ฒญ header ๋ณด์ ์ฒ๋ฆฌ๋ ํด์ค์ ๊ฐ๋ฐ์๊ฐ ์ง์ด์ผ ํ๋ ๋ถ๋ด์ ํฌ๊ฒ ์ค์ฌ์ค.
โ
โ
โ
์คํ๋ง ์ํ๋ฆฌํฐ๋ ํํฐ ๊ธฐ๋ฐ์ผ๋ก ๋์ํจ
โ
๋ค์ํ ํํฐ๋ค์ด ์๋๋ฐ, ๊ฐ ํํฐ์์
์ธ์ฆ, ์ธ๊ฐ ๊ด๋ จ๋ ์์ ์ฒ๋ฆฌํจ.

์ผ์ชฝ ์ธ๋ก๋ก ๊ธธ์ญํ ํํฐ ์์์ ์๋๋ก ๋ด๋ ค์ค๋ ์์์ธ๋ฏ.
โ
ํ ๋ ์ด์ด์ฉ ํํฐ ์๋ ํ ๋๋ง๋ค, ์ฐ๊ฒฐ๋ ์ค๋ฅธ์ชฝ ํด๋์ค๋ฅผ ๊ฑฐ์น๋ฉฐ ์คํํจ.
ํน์ ํํฐ๋ ์ ๊ฑฐํ๊ฑฐ๋, ์ปค์คํ ํ๋ ๋ฑ ์ค์ ๋ ๊ฐ๋ฅ.
โ
์ฌ๊ธฐ์ ํ์์ผ๋ก ์น ํด์ง
UsernamePasswordAuthenticationFilter
FilterSecurityInterceptor
๋๊ฐ๊ฐ ์ค์ํจ
โ
UsernamePasswordAuthenticationFilter:
id, pw๊ฐ ๋์ด์ค๋ฉด, ์ธ์ฆ ์์ฒญ์ ์์ํ๋ ์ธ์ฆ ๊ด๋ฆฌ์ ์ญํ
์ธ์ฆ ์ฑ๊ณตํ๋ฉด, AuthenticationSuccessHandler๋ฅผ ์คํ
์ธ์ฆ ์คํจํ๋ฉด, AuthenticationFailureHandler๋ฅผ ์คํ
โ
FilterSecurityInterceptor :
๊ถํ ๋ถ์ฌ ์ฒ๋ฆฌ๋ฅผ ์์, ์ ๊ทผ ์ ์ด ๊ฒฐ์ ์ ์ฝ๊ฒํ๋ ๊ฒฐ์ ๊ด๋ฆฌ์ ์ญํ
์ด ๊ณผ์ ์์๋ ์ฌ์ฉ์๋ ์ด๋ฏธ ์ธ์ฆ๋ ์ํ. ์ ํจํ ์ฌ์ฉ์์ธ์ง๋ ์ ์ ์์.
-> ์ธ๊ฐ ๊ด๋ จ ์ค์ ๊ฐ๋ฅ.
โ
๊ทผ๋ฐ ์ฑ ์ ํ์คํ์ค ์ฝ๋๋ฐ ์ดํด ์๋๋๊ฒ ๋๋ฌด ๋ง์.
โ
1. ์ฌ์ฉ์๊ฐ ์์ด๋, ๋น๋ฒ ์
๋ ฅํ๋ฉด
HTTPServletRequest์ id, pw์ ๋ณด๊ฐ ์ ๋ฌ๋จ.
AuthenticationFilter๊ฐ ๋์ด์จ id,pw์ ํจ์ฑ์ ๊ฒ์ฌ
(์ฌ๊ธฐ์ ๋งํ๋ ์ ํจ์ฑ์ด๋ผ๋๊ฒ?)
2. ์ ํจ์ฑ ๊ฒ์ฌ๊ฐ ๋๋๊ณ UsernamePasswordAuthenticationToken์
3. AuthenticationManagerํํ
๋๊ฒจ์ฃผ๊ณ ,
4. ๊ทธ๊ฑธ ๋ค์ AuthenticationProviderํํ
๋ณด๋ธ๋ค.
(๋ฐ๋ก Providerํํ
์ฃผ๋ฉด ์๋จ? Manager๋ ์ ๊ฑฐ์น๋๊ฑฐ์ผ)
5. ์ฌ์ฉ์ ์์ด๋๋ฅผ UserDetatilService์ ๋ณด๋ด๊ณ ,
UserDetailService๋ ์ฌ์ฉ์ ์์ด๋๋ก ์ฐพ์ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ UserDetails ๊ฐ์ฒด๋ก ๋ง๋ค์ด์
AuthenticationProviderํํ
๋๊ธด๋ค.
6. DB์ ์๋ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์จ๋ค
(์ด๋ DB์ ์ต์ด๋ก ์ ๊ทผํ๋๊ฑฐ ์๋์ง?)
(๋๊ฐ ๊ฐ์ ธ์์ ์ด๋์ ์ฃผ๋๊ฑด๋ฐ?)
7. ์
๋ ฅ ์ ๋ณด๋ UserDetails์ ์ ๋ณด ๋น๊ตํด์ ์ค์ ์ธ์ฆ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
(์
๋ ฅ ์ ๋ณด๋ ์ด๋์ ๋ด๊ฒจ์๋๋ฐ?)
8. ์ธ์ฆ ์๋ฃ๋๋ฉด, SecurityContextHolde์์ Authentication์ ์ ์ฅํจ.
์ธ์ฆ ์ฑ๊ณต ์ฌ๋ถ์ ๋ฐ๋ผ์ AuthenticationSucessHandler, AuthenticationFailureHandler์คํ
(๊ดํธ) ์์ ๋ด์ฉ์ด ์ฝ์๋ง์ ๋ ์ค๋ฅด๋ ๊ถ๊ธ์ฆ์ด์์.
โ
โ
โ
โ
1. (์ฌ๊ธฐ์ ๋งํ๋ ์ ํจ์ฑ์ด๋?)
์ฒจ์ gptํํ ๋ฌผ์ด๋ณด๋๊น ๊ณต๋ฐฑ๊ฒ์ฌ๊ฐ์ ์ ํจ์ฑ ๊ฒ์ฌ (์ฃผ๋ก ํ๋ก ํธ์์ ํ๋ค๊ณ ํจ)
DB์์ ์์ด๋๋ก ์ฌ์ฉ์ ์กฐํ ๊ฒ์ฌ
๋ผ๊ณ ํ์;;;;;
๊ทผ๋ฐ ์ ๊ฑฐ ํ๋ฆฐ๋ง์.
โ
DB๋ฅผ ์กฐํํ๋๊ฑด AuthenticationProvider๋จ๊ณ์์ ํจ.
โ
๋ฐ๋ผ์ ์ผ๋ฐ์ ์ผ๋ก ์ ํจ์ฑ๊ฒ์ฌ ? ์ํ๋ค๋๊ฑฐ์!!!
๊ฑ ํผ ์ ํจ์ฑ ๊ฒ์ฌ ์ ๋๊ณ , DB์๋ ๋ฌด๊ด. ๊ฑ ๋๊ธด๋ค๊ณ ํจ.
โ
2. ( ์ Manager๋ฅผ ๊ฑฐ์ณ์ Providerํํ ๊ฐ๋๊ฐ?)
AuthenticationManager๋ ์ค๊ฐ ๊ด๋ฆฌ์ ์ญํ ์.
๋ด๋ถ์ ์ฌ๋ฌ๊ฐ์ AuthenticationProvider๋ฅผ ๊ฐ๊ณ ์์.
์ ๋ฌ๋ฐ์ Authentication์ ์ฒ๋ฆฌํ ์ ์๋ Provider๋ฅผ ์ฐพ์์ ์์ํ๋๊ฒ์.
โ
์? ์คํ๋ง ์ํ๋ฆฌํฐ๋ ์ธ์ฆ ๋ฐฉ์์ด ์ฌ๋ฌ๊ฐ์.
ex. ํผ ๋ก๊ทธ์ธ์ฉ, ํ ํฐ ์ธ์ฆ์ฉ, ์์ ๋ก๊ทธ์ธ์ฉ...
์ข ๋ฅ๊ฐ ๋ง์์, ๋งค๋์ ๊ฐ ํ๋จ, ๋ถ๋ฐฐํ๋ ์ญํ ์ ํ๋๊ฑฐ์.
โ
โ
3. (์ด๋ DB์ ์ต์ด๋ก ์ ๊ทผํ๋๊ฑฐ ์๋์ง?)
๋ง์!
AuthenticationProvider๊ฐ UserDetailsService.loadUserByUsername()์ด
ํธ์ถ๋๋ ์์ ์ ์ผ์ด๋จ.
โ
UserDetailServiceํด๋์ค๋ ๊ฐ๋ฐ์๊ฐ ๊ตฌํํ๋ ํด๋์ค์.
โ
๊ทธ๋ฆฌ๊ณ , ๊ทธ๋ ๊ฒ ์กฐํํ ์ ๋ณด๊ณ UserDetails ๊ฐ์ฒด ๋ง๋ค์ด์ ๋๊ฒจ์ฃผ๋๊ฒ.
โ
โ
4. (๋๊ฐ ๊ฐ์ ธ์์ ์ด๋์ ์ฃผ๋๊ฑด๋ฐ?)
UserDetailsService๊ฐ DB์์ ์ ๋ณด ๊ฐ์ ธ์์, AuthenticationProviderํํ ๋๊ฒจ์ฃผ๊ณ
์ธ์ฆ ํ๋จ์ ์ฐ์ด๊ฒ ๋จ.
โ
โ
5. (์ ๋ ฅ ์ ๋ณด๋ ์ด๋์ ๋ด๊ฒจ์๋๋ฐ?)
์ฒ์์ ์ ์ ๊ฐ ๋ก๊ทธ์ธ ์๋ํ๋ ค๊ณ ์ ๋ ฅํ์ ๋
๊ทธ๊ฑธ ๋ฐํ์ผ๋ก UserPasswordAuthenticationToken๋ง๋ค์์์ด?
new UsernamePasswordAuthenticationToken(username, password);
์ฌ๊ธฐ์ ๋ด๊ฒจ์์!!!
์ด ๊ฐ์ฒด๋ ๊ณ์ Authenticationํ์ ์ผ๋ก ์ ๋ฌ๋จ.
โ
๊ทธ๊ฑฐ๋ UserDetailsService๊ฐ์ฒด์ ๋ด๊ธด ์ ๋ณด๋ ๋น๊ตํ๋๊ฑฐ.
โ
โ
UserDetailsService๊ฐ์ฒด์์ ๊บผ๋ด์ฌ๋๋
UserDetails userDetails = userDetailsService.loadUserByUsername(username);
String encodedPassword = userDetails.getPassword();
์ด๋ ๊ฒ ๊บผ๋ด์ ๋น๊ต.