๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Springboot/Spring Security

[Spring Security] What is Spring Security?

by ๋Œ€๋ณต2 2025. 5. 26.

์„œ๋ก 

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์— ์ €์žฅ๋œ ์ธ์ฆ ์ •๋ณด๋Š” ์ดํ›„ ์ธ๊ฐ€ ์ ˆ์ฐจ๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—์„œ ํ˜„์žฌ ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€ ํ™œ์šฉํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ
  • 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์—๊ฒŒ ์ธ์ฆ์„ ์œ„์ž„
  • 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 ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ์ ‘๊ทผ ๊ฑฐ๋ถ€ ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ
  • AuthorizationFilter (Spring Security 6์˜ ๊ธฐ๋ณธ ๊ถŒํ•œ ๋ถ€์—ฌ ํ•„ํ„ฐ)
    • ํ•„ํ„ฐ ์ฒด์ธ์˜ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ์œ„์น˜ํ•˜์—ฌ, ์‹ค์ œ ๋ฆฌ์†Œ์Šค(URL, ๋ฉ”์„œ๋“œ ๋“ฑ)์— ๋Œ€ํ•œ ๊ถŒํ•œ ๋ถ€์—ฌ(Authorization)๋ฅผ ๋‹ด๋‹น
    • SecurityContextHolder์— ์ €์žฅ๋œ Authentication ๊ฐ์ฒด(์ธ์ฆ๋œ ์‚ฌ์šฉ์ž ์ •๋ณด)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ AuthorizationManager๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํ˜„์žฌ ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญ๋œ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•  ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€ ์ตœ์ข…์ ์œผ๋กœ ํ™•์ธ

3. ์‘๋‹ต ๋ฐ˜ํ™˜

  • ๋ชจ๋“  ํ•„ํ„ฐ ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜๊ณ , ํ•„์š”ํ•œ ๊ฒฝ์šฐ AuthorizationFilter๋ฅผ ํ†ตํ•ด ๊ถŒํ•œ๊นŒ์ง€ ๋ถ€์—ฌ๋˜์—ˆ๋‹ค๋ฉด, HTTP ์š”์ฒญ์€ ์ตœ์ข…์ ์œผ๋กœ ์ปจํŠธ๋กค๋Ÿฌ๋‚˜ REST ์—”๋“œํฌ์ธํŠธ๋กœ ์ „๋‹ฌ๋˜์–ด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ˆ˜ํ–‰
  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฒ˜๋ฆฌ ํ›„ ์ƒ์„ฑ๋œ ์‘๋‹ต์€ ํ•„ํ„ฐ ์ฒด์ธ์„ ์—ญ์ˆœ์œผ๋กœ ๋‹ค์‹œ ๊ฑฐ์น˜๋ฉฐ, ๊ฐ ํ•„ํ„ฐ๋Š” ์‘๋‹ต ํ—ค๋” ์ถ”๊ฐ€
  • (HeaderWriterFilter), ์„ธ์…˜ ์ •๋ฆฌ(SecurityContextHolderFilter) ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ ํ›„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ตœ์ข…์ ์œผ๋กœ ์ „๋‹ฌ

์ธ์ฆ ๊ณผ์ •(Form Login ์˜ˆ์‹œ)

  1. ์š”์ฒญ ์ˆ˜์‹ : ์‚ฌ์šฉ์ž์˜ ๋กœ๊ทธ์ธ ์ •๋ณด(์•„์ด๋””, ๋น„๋ฐ€๋ฒˆํ˜ธ ๋“ฑ)๊ฐ€ ๋‹ด๊ธด HTTP ์š”์ฒญ์„ ์ˆ˜์‹ 

  2.  ํ•„ํ„ฐ์— ์˜ํ•œ ์š”์ฒญ ๊ฐ€๋กœ์ฑ”: AuthenticationFilter๊ฐ€ ์ด ์š”์ฒญ์„ ๊ฐ€๋กœ์ฑ”

  3. Authentication ๊ฐ์ฒด ์ƒ์„ฑ: ์š”์ฒญ์œผ๋กœ๋ถ€ํ„ฐ ์‚ฌ์šฉ์ž์˜ ์ž๊ฒฉ ์ฆ๋ช… ์ •๋ณด๋ฅผ ์ถ”์ถœํ•˜์—ฌ ์ธ์ฆ์šฉ ๊ฐ์ฒด(Authentication)๋ฅผ ์ƒ์„ฑ(UsernamePasswordAuthenticationToken์˜ ์ธ์ฆ์šฉ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ)

  4.  AuthenticationManager์—๊ฒŒ ์œ„์ž„: ์ƒ์„ฑ๋œ Authentication ๊ฐ์ฒด๋Š” AuthenticationManager์—๊ฒŒ ์ „๋‹ฌ๋˜์–ด ์ธ์ฆ ์ฒ˜๋ฆฌ๊ฐ€ ์œ„์ž„ (ProviderManager๋Š” ์ด ๊ฐ์ฒด๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„ ์ธ์ฆ ์ ˆ์ฐจ๋ฅผ ์‹œ์ž‘)

  5. AuthenticationProvider ์„ ํƒ ๋ฐ ์ธ์ฆ ์‹œ๋„: AuthenticationManager๋Š” ์ž์‹ ์ด ๊ฐ€์ง„ ์—ฌ๋Ÿฌ AuthenticationProvider๋“ค ์ค‘ ํ•ด๋‹น Authentication ๊ฐ์ฒด๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” Provider๋ฅผ ์ฐพ์•„ ์ธ์ฆ ์ฒ˜๋ฆฌ๋ฅผ ๋‹ค์‹œ ์œ„์ž„

  6. UserDetailsService๋ฅผ ํ†ตํ•œ ์‚ฌ์šฉ์ž ์ •๋ณด ์กฐํšŒ: ์„ ํƒ๋œ AuthenticationProvider๋Š” UserDetailsService๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž์˜ username์„ ๊ธฐ๋ฐ˜์œผ๋กœ DB ๋“ฑ์—์„œ ์‚ฌ์šฉ์ž ์ƒ์„ธ ์ •๋ณด(UserDetails)๋ฅผ ์กฐํšŒ

  7. ์ž๊ฒฉ ์ฆ๋ช… ๋น„๊ต ๋ฐ ์ธ์ฆ ์ˆ˜ํ–‰: AuthenticationProvider๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ธ ์ž๊ฒฉ ์ฆ๋ช…๊ณผ  UserDetails์˜ ์ •๋ณด๋ฅผ ๋น„๊ต

  8. ์ธ์ฆ ์„ฑ๊ณต/์‹คํŒจ ์ฒ˜๋ฆฌ
    • ์„ฑ๊ณต: ์ธ์ฆ์— ์„ฑ๊ณตํ•˜๋ฉด AuthenticationProvider๋Š” ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋‹ด์€ Authentication ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜
      • ์ด ๊ฐ์ฒด๋Š” ProviderManager๋ฅผ ๊ฑฐ์ณ ์ตœ์ข…์ ์œผ๋กœ ์„ฑ๊ณต ๊ฒฐ๊ณผ๋กœ ์ฒ˜๋ฆฌ
    • ์‹คํŒจ: ์ธ์ฆ์— ์‹คํŒจํ•˜๋ฉด AuthenticationProvider๋Š” AuthenticationException์„ ๋ฐœ์ƒProviderManager๋ฅผ ๊ฑฐ์ณ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
      • ExceptionTranslationFilter๊ฐ€ ์ด๋Ÿฌํ•œ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜์—ฌ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•˜๋Š” ๋“ฑ์˜ ์ ์ ˆํ•œ ์‘๋‹ต์„ ๋ฐ˜ํ™˜
    • ๋งŒ์•ฝ ๋ชจ๋“  Provider๊ฐ€ ํ•ธ๋“ค๋ง์— ์‹คํŒจํ•˜๊ฑฐ๋‚˜ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ProviderNotFoundException์ด ๋ฐœ์ƒ
  9. SecurityContextHolder์— ์ €์žฅ: ์ธ์ฆ์ด ์™„๋ฃŒ๋˜๋ฉด ๊ฒฐ๊ณผ๋กœ ๋ฐ˜ํ™˜๋œ Authentication ๊ฐ์ฒด๋Š” SecurityContextHolder์— ์ €์žฅ SecurityContextHolder๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ThreadLocal์„ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฌ ์š”์ฒญ ์Šค๋ ˆ๋“œ์˜ SecurityContext์— ์ด ์ •๋ณด๋ฅผ ์ถ”๊ฐ€

  10. ์ดํ›„ ์ฒ˜๋ฆฌ: SecurityContextHolder์— ์ €์žฅ๋œ ์ธ์ฆ ์ •๋ณด๋Š” ์ดํ›„ ์ธ๊ฐ€ ์ ˆ์ฐจ๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—์„œ ํ˜„์žฌ ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€ ํ™œ์šฉํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ