[Beyond SW] ๐ŸšงSpring Security

์ด๊ฒฝ๋ฏผยท3์ผ ์ „

ํ•œํ™”์‹œ์Šคํ…œ Beyond SW

๋ชฉ๋ก ๋ณด๊ธฐ
38/40

Spring Security

์Šคํ”„๋ง ๊ธฐ๋ฐ˜์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ณด์•ˆ(์ธ์ฆ, ์ธ๊ฐ€)์„ ๋‹ด๋‹นํ•˜๋Š” ์Šคํ”„๋ง ํ•˜์œ„ ํ”„๋ ˆ์ž„์›Œํฌ
Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ธ์ฆ๊ณผ ๊ถŒํ•œ ๋ถ€์—ฌ๋ฅผ ๋ชจ๋‘ ์ œ๊ณตํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘” ํ”„๋ ˆ์ž„์›Œํฌ

ํŠน์ง•

  • ๋ชจ๋“  URL ์š”์ฒญ์„ ๊ฐ€๋กœ์ฑˆ ๋’ค ์ธ์ฆ ์š”๊ตฌํ•˜๋ฉฐ login form ์ œ๊ณต
  • ์—ฌ๋Ÿฌ๊ฐ€์ง€ Servlet API ๋ฉ”์†Œ๋“œ ์ œ๊ณต
  • ์ธ์ฆ ๋ฐ ๊ถŒํ•œ ๋ถ€์—ฌ์— ๋Œ€ํ•œ ํ™•์žฅ์ด๊ฐ€๋Šฅํ•˜๋„๋ก ์ง€์›ํ•จ
  • ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ CSRF ๊ณต๊ฒฉ์œผ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธ

์ธ์ฆ

์‚ฌ์šฉ์ž ์ฆ๋ช…
๋ณดํ˜ธ๋œ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•˜๋Š” ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ณผ์ •.

์ธ๊ฐ€

๊ถŒํ•œ ๋ถ€์—ฌ
์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๊ฐ€ ์‹œ์Šคํ…œ์ž์›์— ๋Œ€ํ•œ ์ ‘๊ทผ ์‹œ ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ณผ์ •.

๋ณด์•ˆ ์ฃผ์ฒด

๋ณด์•ˆ ์‹œ์Šคํ…œ์ด ์ž‘๋™๋˜๊ณ  ์žˆ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ‘๊ทผํ•˜๋Š” ์œ ์ €(Principal์ด๋ผ๊ณ  ํ•จ)
๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•˜๋Š” ๋Œ€์ƒ์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” Credential

์›๋ฆฌ

์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ์—์„œ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ํ•ด๋‹น ์š”์ฒญ์€ ์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ๋“ค๋กœ ๊ฐœ๋ฐœํ•œ ์‹œํ๋ฆฌํ‹ฐ ํ•„ํ„ฐ๋ฅผ ๋™์ž‘์‹œํ‚ด(์—ฌ๋Ÿฌ๊ฐ€์ง€ ํ•„ํ„ฐ๋“ค์ด ์ˆœ์„œ๋Œ€๋กœ ๋™์ž‘)

SecurityContextPersistenceFilter SecurityContextRepository์—์„œ SecurityContext ๊ฐ์ฒด๋ฅผ ๋กœ๋”ฉํ•˜์—ฌ SecurityContextHolder์— ์ €์žฅํ•˜๊ณ , ์š”์ฒญ ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚˜๋ฉด ์ œ๊ฑฐํ•œ๋‹ค.
LogoutFilter ์ง€์ •ํ•œ ๊ฒฝ๋กœ์˜ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ๋กœ๊ทธ์•„์›ƒํ•˜๊ณ  ์ง€์ •ํ•œ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋ฉฐ ์ดํ›„ ํ•„ํ„ฐ๋“ค์„ ์ง„ํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค.
UsernamePasswordAuthenticationFilter ๋กœ๊ทธ์ธ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ์•„์ด๋””/๋น„๋ฐ€๋ฒˆํ˜ธ ๊ธฐ๋ฐ˜์˜ ์ธ์ฆ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์„ฑ๊ณตํ•˜๋ฉด ์ง€์ •ํ•œ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๊ณ  ์‹คํŒจ ์‹œ ๋กœ๊ทธ์ธ ํ™”๋ฉด์„ ๋ณด์—ฌ์ค€๋‹ค.
DefaultLoginPageGeneratingFilter ๋กœ๊ทธ์ธ ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ์‹œ ๋กœ๊ทธ์ธ ํ™”๋ฉด์„ ์ถœ๋ ฅํ•˜๊ณ  ์ดํ›„ ํ•„ํ„ฐ๋ฅผ ์ง„ํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค.
AnonymousAuthentiactionFilter ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆ์„ ๋ฐ›์ง€ ๋ชปํ•  ์‹œ Authentication ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ SecurityContext์— ์„ค์ •ํ•œ๋‹ค.
์ƒ์„ฑ๋œ Authentication์˜ ์•„์ด๋””๋Š” "anonymouseUser"์ด๋ฉฐ ๊ถŒํ•œ์€ "ROLE_ANONYMOUS"๋กœ ์ธ์ฆ๋˜์ง€ ์•Š์€ ์ƒํƒœ ๊ฐ’์„ ๊ฐ€์ง„๋‹ค.
SessionManagementFilter ์„ธ์…˜ ํƒ€์ž„์•„์›ƒ, ๋™์‹œ ์ ‘๊ทผ ์ œ์–ด, ์„ธ์…˜ ๊ณ ์ • ๊ณต๊ฒฉ๋“ฑ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.
ExceptionTranslationFilter FilterSecurityInterceptor์—์„œ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๋ฅผ 403 ์ฝ”๋“œ๋กœ ์‘๋‹ตํ•˜๊ฑฐ๋‚˜ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋Š” ์ž‘์—…์„ ์ง„ํ–‰ํ•œ๋‹ค.
FilterSecurityInterceptor ํ˜„์žฌ ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •ํ•œ ๊ฒฝ๋กœ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์‚ฌํ•˜๋ฉฐ ๊ถŒํ•œ์ด ์žˆ์œผ๋ฉด ๋ณด์•ˆํ•„ํ„ฐ๋ฅผ ํ†ต๊ณผ์‹œ์ผœ ์ž์›์— ์ ‘๊ทผ์‹œํ‚ค๊ณ  ๊ถŒํ•œ์ด ์—†์œผ๋ฉด ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ ์‹œํ‚จ๋‹ค.

์ค‘์š”ํ•„ํ„ฐ

  • UsernamePasswordAuthenticationFilter : ์‚ฌ์šฉ์ž์˜ ์ธ์ฆ ์ •๋ณด ์ด์šฉํ•ด '์ธ์ฆ' ์ฒ˜๋ฆฌ
  • FilterSecurityInterceptor : ์ธ์ฆ์— ์„ฑ๊ณตํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•  ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€ ๊ฒ€์ฆ('์ธ๊ฐ€')

Security๋ฅผ ํ†ตํ•œ ์ „๋ฐ˜์ ์ธ Login ์ ˆ์ฐจ


1. ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ์— ๋Œ€ํ•œ ์š”์ฒญ์ด ๋“ค์–ด์˜ด
2. AuthenticationFilter๊ฐ€ ์š”์ฒญ ๋ฐ›์•„ UsernamePasswordAuthenticationToken ์ƒ์„ฑ
3. Authentication Manager๊ฐ€ Listํ˜•ํƒœ๋กœ ์ง€๋‹Œ Provider๋“ค์„ ์ฐจ๋ก€๋กœ ํ™•์ธ. ๊ฐ Provider์˜supports ๋ฉ”์†Œ๋“œ ํ™•์ธ
4. supports ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœํ•ด ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•œ AuthenticationProvider ์„ ํƒ.
5. UserDetailsService ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์—์„œ Spring Security๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์‚ฌ์šฉ์ž ์ •๋ณด ํ˜•ํƒœ์ธ UserDetails๋ฅผ ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ๊ฐ€์ง€๋Š” ์˜ค๋ฒ„๋ผ์ด๋”ฉ๋œ loadUserByUsername์„ ํ™•์ธ
6. ์˜ค๋ฒ„๋ผ์ด๋”ฉ๋œ loadUserByUsername ๋ฉ”์†Œ๋“œ์˜ ๋กœ์ง์— ๋”ฐ๋ผ DB์—์„œ ์‚ฌ์šฉ์ž์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ด์–ด UserDetails๋กœ ๋ฐ˜ํ™˜
7. ์ธ์ฆ์ด ์™„๋ฃŒ๋˜๋ฉด ์ธ๋ฉ”๋ชจ๋ฆฌ ์ €์žฅ์†Œ์ธ SecurityContextHolder๊ฐ€ SecrityContext์— Authentication ๊ฐ์ฒด ์ €์žฅ. ์ดํ›„ ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž ์ •๋ณด ํ•„์š” ์‹œ Securitycontextholder.getcontext().getauthentication()์œผ๋กœ ์ธ์ฆ๋œ authentication ๊ฐ์ฒด ๊บผ๋ƒ„

์ธ์ฆ : Session(Cookie) vs. Token

Session ๋กœ๊ทธ์ธ

Session

  • ๊ณ ์œ ID, ๋กœ๊ทธ์ธ ์‹œ๊ฐ„ ๋ฐ ๋งŒ๋ฃŒ ์‹œ๊ฐ„ ๋“ฑ๊ณผ ๊ฐ™์€ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ์ž‘์€ ํŒŒ์ผ.
  • ์‚ฌ์šฉ์ž ์š”์ฒญ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„œ๋ฒ„์—์„œ ์ƒ์„ฑ๋˜์–ด ์„œ๋ฒ„์— ์ €์žฅ๋จ
  • ์‚ฌ์šฉ์ž๋Š” ์„œ๋ฒ„๊ฐ€ ID๋ฅผ ์ธ์‹ํ•˜๊ณ  ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ์Šน์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ID๋ฅผ ์ฟ ํ‚ค๋กœ ๋ฐ›๊ณ  ์ดํ›„ ์š”์ฒญ์— ํ•จ๊ป˜ ๋ณด๋ƒ„

0๊ฐœ์˜ ๋Œ“๊ธ€