๐Ÿ™ Spring Security์˜ ์ธ์ฆ ์ฒ˜๋ฆฌ ํ๋ฆ„

 

 

Authentication flow

 

 


 

 

๐Ÿ™ Authentication(์ธ์ฆ)

 

 

๐Ÿ˜ Authentication ์ธํ„ฐํŽ˜์ด์Šค

 

๐Ÿฅ Spring Security์—์„œ Authentication์€ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์กด์žฌํ•œ๋‹ค.

๐Ÿฅ ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆ์„ ์„ฑ๊ณต์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋ฉด ์‚ฌ์šฉ์ž์˜ ์ธ์ฆ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๋‹ค.

๐Ÿฅ SecurityContextHolder๋Š” SecurityContext๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  SecurityContext๋Š” Authentication ๊ฐ์ฒด๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค.

๐Ÿฅ ์ผ๋ฐ˜์ ์œผ๋กœ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ตฌํ˜„์ฒด๋Š” UsernamePasswordAuthenticationToken ์ด๋‹ค.

โžก๏ธ ์‚ฌ์šฉ์ž์˜ ๊ณ ์œ  ์‹๋ณ„์ž(Username)๊ณผ ์•”ํ˜ธ(Password)๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ Authentication ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

๐Ÿ˜ Spring Security๋‚ด์—์„œ์˜ Authentication ์ฃผ์š” ๋ชฉ์ 

 

  • ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆ์„ ์œ„ํ•ด ์ œ๊ณตํ•œ Credential(์ž๊ฒฉ์ฆ๋ช…)์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด AuthenticationManager์— ๋Œ€ํ•œ ์ž…๋ ฅ๊ฐ’์ด๋‹ค.
  • ํ˜„์žฌ ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ํ˜„์žฌ Authenticaion์€ SecurityContext์—์„œ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

๐Ÿ˜ Authentication ์— ํฌํ•จ๋œ ์ •๋ณด

 

๐Ÿฐ principal

  • ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•œ๋‹ค.
  • UserDetails ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์ฒด๋Š” ์‚ฌ์šฉ์ž์˜ username๊ณผ password๋กœ ์ธ์ฆ์ด ์ด๋ฃจ์–ด์ง„๋‹ค.
  • ๊ตฌํ˜„์ฒด ์œ„์น˜ : org.springframework.security.core.userdetails.User
  • ์ง์ ‘ UserDetails๋ฅผ ์ƒ์†๋ฐ›์•„ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

๐Ÿฐ credentials

  • ๋Œ€๋ถ€๋ถ„ password ์ด๋‹ค.
  • ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ์•ˆ์ฆ ํ›„์— ์œ ์ถœ๋˜์ง€ ์•Š๋„๋ก ์‚ญ์ œ๋œ๋‹ค.

 

๐Ÿฐ authorities

  • AuthenticationManager์— ์˜ํ•ด ๋ถ€์—ฌ๋œ ์ธ๊ฐ€์— ๋Œ€ํ•œ ์ •๋ณด์ด๋‹ค.
  • ๋ถ€์—ฌ๋œ ๊ถŒํ•œ์— ๋Œ€ํ•œ ์ •๋ณด๋Š” GrantedAuthority๋กœ ์ถ”์ƒํ™”ํ•œ๋‹ค.
  • ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌํ˜„์ฒด๋Š” SimpleGrantedAuthority ์ด๋‹ค.

 

 

 

๐Ÿ˜ Spring Security ์—์„œ Authentication

 

  • Spring Security ๋Š” ์ข…ํ•ฉ์ ์ธ ์ธ์ฆ์ฒ˜๋ฆฌ๋ฅผ ์ง€์›ํ•œ๋‹ค.
  • ์ธ์ฆ์€ ํŠน์ • ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋ˆ„๊ตฌ์ธ์ง€ ํ™•์ธํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
  • ๋ณดํ†ต ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฆ„๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์‚ฌ์šฉ์ž๋ฅผ ์ธ์ฆํ•œ๋‹ค.
  • ํ•œ๋ฒˆ ์ธ์ฆํ•˜๋ฉด ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋‹ค. (Authorization, ์ธ๊ฐ€)

 

 

 

๐Ÿ˜ Password Storage

 

Spring Security์˜ PasswordEncoder ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹จ๋ฐฉํ–ฅ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•ด์ค€๋‹ค.

  • PasswordEncoder ๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋‹จ๋ฐ˜ํ–ฅ(๋น„๋ฐ€๋ฒˆํ˜ธ -> ์•”ํ˜ธํ™”)์œผ๋กœ ๋ณ€ํ™˜, ์–‘๋ฐฉํ–ฅ ๋ณ€ํ™˜ ๋ชฉ์  x
  • ์ธ์ฆ์— ์‚ฌ์šฉํ•  credential ์ •๋ณด๋ฅผ ์ €์žฅํ•œ๋‹ค.

PasswordEncoder ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ €์žฅํ•˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ์ธ์ฆ ์‹œ์ ์— ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ๋น„๊ตํ•˜๋Š” ์šฉ๋„์ด๋‹ค.

 

 

 

๐Ÿ˜ Password Storage History

 

ํŒจ์Šค์›Œ๋“œ๋ฅผ ์ €์žฅํ•˜๋Š” ํ‘œ์ค€ ๋งค์ปค๋‹ˆ์ฆ˜์˜ ๋ณ€ํ™”

 

๐Ÿฐ ์ฒ˜์Œ์—๋Š” ์ผ๋ฐ˜ ํ…์ŠคํŠธ๋กœ ์•”ํ˜ธ๋ฅผ ์ €์žฅํ–ˆ๋‹ค.

  • ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” DB์— ์ ‘๊ทผํ•˜๋ ค๋ฉด credential์ด ํ•„์š”ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์•ˆ์ „ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.
  • ์•…์˜์ ์ธ SQL Injection ๊ฐ™์€ ๊ณต๊ฒฉ์œผ๋กœ “Data dump”๋ฅผ ์ฝ์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•œ๋‹ค.

 

๐Ÿฐ ์•”ํ˜ธ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์ „์— SHA-256 ๊ฐ™์€ ๋‹จ๋ฐฉํ–ฅ ํ•ด์‹œ๋ฅผ ์‹คํ–‰ํ•œ ํ›„ ์•”ํ˜ธ๋ฅผ ์ €์žฅํ–ˆ๋‹ค.

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

 

๐Ÿฐ ๋ ˆ์ธ๋ณด์šฐ ํ…Œ์ด๋ธ”์„ ๋ฌด๋ ฅํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์†”ํ‹ฐ๋“œ ํŒจ์Šค์›Œ๋“œ(salted password)๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

  • ๋น„๋ฐ€๋ฒˆํ˜ธ ํ•ด์‹œ ํ•จ์ˆ˜ โžก๏ธ ๋ชจ๋“  ์‚ฌ์šฉ์ž์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ๋žœ๋ค ๋ฐ”์ดํŠธ(์†”ํŠธ)๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.
  • ์†”ํŠธ์™€ ์‚ฌ์šฉ์ž์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์œ ๋‹ˆํฌํ•œ ํ•ด์‹œ๊ฐ’์„ ์ƒ์„ฑํ•œ๋‹ค.
  • ์†”ํŠธ๋Š” ์œ ๋‹ˆํฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์†”ํŠธ์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ ์กฐํ•ฉ์€ ๋ ˆ์ธ๋ณด์šฐ ํ…Œ์ด๋ธ”์„ ๋ฌด๋ ฅํ™”ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
  • ํ•˜์ง€๋งŒ ๊ธฐ์ˆ ์ด ๋ฐœ์ „ํ•จ์— ๋”ฐ๋ผ ์ตœ์‹  ํ•˜๋“œ์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ดˆ๋‹น ์ˆ˜์‹ญ์–ต ๊ฑด์„ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋ฉฐ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์‰ฝ๊ฒŒ ํ•ด๋…ํ•  ์ˆ˜ ์žˆ์–ด SHA-256๊ฐ™์€ ํ•ด์‹œ๊ฐ€ ๋” ์ด์ƒ ์•ˆ์ „ํ•˜์ง€ ์•Š๊ฒŒ ๋˜์—ˆ๋‹ค.

 

๐Ÿฐ ํ˜„์žฌ๋Š” ์ ์‘ํ˜• ๋‹จ๋ฐฉํ–ฅ ํ•จ์ˆ˜(adaptive one-way function)๋กœ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.

  • CPU, ๋ฉ”๋ชจ๋ฆฌ ๋“ฑ ๋งŽ์€ ๋ฆฌ์†Œ์Šค๋ฅผ ์†Œ๋ชจํ•ด์„œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๊ฒ€์ฆ โžก๏ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.
  • ์ ์‘ํ˜• ๋‹จ๋ฐฉํ–ฅ ํ•จ์ˆ˜๋Š” ํ•˜๋“œ์›จ์–ด ์‚ฌ์–‘์— ๋”ฐ๋ผ work factor๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์›Œํฌ ํŒฉํ„ฐ(work factor) : ๊ณต๊ฒฉ์ž๊ฐ€ ์•”ํ˜ธ๋ฅผ ๊นจ๋Š”๋ฐ ๋“œ๋Š” ๋…ธ๋ ฅ, ์‹œ์Šคํ…œ์—์„œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๊ฒ€์ฆํ•  ๋•Œ ์†Œ์š”๋˜๋Š” ์‹œ๊ฐ„๊ณผ ๊ด€๋ จ์žˆ๋‹ค.
  • ๊ณต๊ฒฉ์ž๊ฐ€ ์‰ฝ๊ฒŒ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ•ด๋…ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋งŒ๋“ค์ง€๋งŒ ์‹œ์Šคํ…œ ์ž์ฒด์— ๋ถ€๋‹ด์ด ๋œ๋‹ค.
  • Spring Security ๋Š” work factor ์‹œ์ž‘์ ์„ ์ œ๊ณตํ•˜์ง€๋งŒ ์„ฑ๋Šฅ์— ๋”ฐ๋ผ ๊ฐ์ž์˜ ์‹œ์Šคํ…œ์— ๋งž๊ฒŒ ์„ค์ •ํ•˜๋Š”๊ฒŒ ์ข‹๋‹ค.
  • ์ข…๋ฅ˜ : bcrypt, PBKDF2, scrypt, argon2
  • ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ถ„์—์„œ ์žฅ๊ธฐ ์ž๊ฒฉ ์ฆ๋ช…(์‚ฌ์šฉ์ž ์ด๋ฆ„๋ฐ ์•”ํ˜ธ)์—์„œ ๋‹จ๊ธฐ ์ž๊ฒฉ ์ฆ๋ช…(์„ธ์…˜, OAuth ํ† ํฐ ๋“ฑ)์œผ๋กœ ๋ฐ”๊พธ๋Š”๊ฒŒ ์ข‹๋‹ค. โžก๏ธ ๋‹จ๊ธฐ ์ž๊ฒฉ ์ฆ๋ช…์€ ๋™์ผํ•œ ๋ณด์•ˆ ์ˆ˜์ค€์„ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ๋น ๋ฅด๊ฒŒ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 


 

 

๐Ÿ™ Servlet Authentication Architecture

 

 

๐Ÿ˜ Architecture

 

Servlet authentication์—์„œ ์‚ฌ์šฉํ•˜๋Š” Spring Security์˜ ๊ตฌ์„ฑ์š”์†Œ

 

๐Ÿฐ SecurityContextHolder

Spring Security๊ฐ€ ์ธ์ฆํ•œ ๋Œ€์ƒ์— ๋Œ€ํ•œ ๋””ํ…Œ์ผ์„ ์ €์žฅํ•˜๋Š” ๊ณณ์ด๋‹ค.

SpringContextHolder

 

 

๐Ÿฐ SecurityContext

SecurityContextHolder์—์„œ ๊ฐ€์ ธ์™€์ง„๋‹ค. ํ˜„์žฌ ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์˜ ์ธ์ฆ์„ ํฌํ•จํ•œ๋‹ค.

 

 

๐Ÿฐ Authentication

AuthenticationManager์˜ ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

์‚ฌ์šฉ์ž ์ธ์ฆ์„ ์œ„ํ•ด ์ œ๊ณตํ•œ credential์ด๋‚˜ SecurityContext์— ์žˆ๋Š” ํ˜„์žฌ ์‚ฌ์šฉ์ž์˜ credential์„ ์ œ๊ณตํ•œ๋‹ค.

Authentication์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ •๋ณด๋“ค

  • principal : ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•œ๋‹ค. username/password๋กœ ์ธ์ฆํ•  ๋•Œ ์ฃผ๋กœ UserDetails์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ด์šฉํ•œ๋‹ค.
  • credentials : ์ผ๋ฐ˜์ ์œผ๋กœ password๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. (์œ ์ถœ๋˜์ง€ ์•Š๋„๋ก ์ธ์ฆ ํ›„ ๋น„์šด๋‹ค.)
  • authorities : ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ถ€์—ฌํ•œ ๊ถŒํ•œ์€ grantedAuthority๋กœ ์ถ”์ƒํ™”ํ•œ๋‹ค.

 

 

๐Ÿฐ GrantedAuthority

Authentication์—์„œ principal(์ฃผ์ฒด)์—๊ฒŒ ๋ถ€์—ฌ๋œ authority(๊ถŒํ•œ)์ด๋‹ค. (์—ญํ• , ๋ฒ”์œ„ ๋“ฑ)

Authentication.getAuthorities() ๋ฉ”์„œ๋“œ๋Š” GrantedAuthority ๊ฐ์ฒด๋“ค์„ Collection์œผ๋กœ ๋ฆฌํ„ดํ•œ๋‹ค.

๊ถŒํ•œ์€ ๋ณดํ†ต ์—ญํ• (roles)์ด๋‹ค. (์˜ˆ : "ROLE_ADMINISTRATOR", "ROLE_HR_SUPERVISOR")

์ด๋Ÿฐ ์—ญํ• ๋“ค์€ ๋‚˜์ค‘์— ์›น ๊ถŒํ•œ ๋ถ€์—ฌ, ๋ฉ”์„œ๋“œ ๊ถŒํ•œ ๋ถ€์—ฌ ๋ฐ ๋„๋ฉ”์ธ ๊ฐ์ฒด ๊ถŒํ•œ ๋ถ€์—ฌ๋ฅผ ์œ„ํ•ด ๊ตฌ์„ฑ๋œ๋‹ค.

username/password ๊ธฐ๋ฐ˜ ์ธ์ฆ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด UserDetailsService๊ฐ€ GrantedAuthority๋ฅผ ๋กœ๋“œํ•œ๋‹ค.

GrantedAuthority ๊ฐ์ฒด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์— ๊ฑธ์นœ ๊ถŒํ•œ์„ ์˜๋ฏธํ•œ๋‹ค. (ํŠน์ • ๋„๋ฉ”์ธ์œผ๋กœ ํ•œ์ •ํ•˜๋Š” ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง„ ์•Š๋Š”๋‹ค.)

 

 

๐Ÿฐ AuthenticationManager

Spring Seuciry์˜ ํ•„ํ„ฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ธ์ฆ์„ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋ฐฉ๋ฒ•์„ ์ •์˜ํ•˜๋Š” API์ด๋‹ค.

  • AuthenticationManager๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด(Filter)๊ฐ€ ๋ฆฌํ„ดํ•œ Authentication์„ SecurityContextHolder์— ์„ค์ •ํ•œ๋‹ค.
  • Spring Security์˜ Filters๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ AuthenticationManager๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  SecurityContextHolder์— ์ง์ ‘ ์„ค์ •ํ•˜๋ฉด ๋œ๋‹ค.
  • AuthenticationManager์˜ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ตฌํ˜„์ฒด๋Š” ProviderManager์ด๋‹ค.

 

 

๐Ÿฐ ProviderManager

AuthenticationManager์˜ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๊ตฌํ˜„์ฒด์ด๋‹ค.

  • ProviderManager๋Š” ๋™์ž‘์„ AuthenticationProvider List์— ์œ„์ž„ํ•œ๋‹ค.
  • ๋ชจ๋“  AuthenticationProvider๋Š” ์ธ์ฆ์„ ์„ฑ๊ณต or ์‹คํŒจ or ๊ฒฐ์ •์„ ๋‚ด๋ฆด ์ˆ˜ ์—†๋Š” ์ง€๋ฅผ ํŒ๋‹จํ•˜๊ณ  ๋‹ค์šด์ŠคํŠธ๋ฆผ์— ์žˆ๋Š” AuthenticationProvider๊ฐ€ ๊ฒฐ์ •ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์„ค์ •ํ•œ AuthenticationProvider๋“ค ์ค‘ ์–ด๋–ค ๊ฒƒ๋„ ์ธ์ฆํ•  ์ˆ˜ ์—†๋‹ค๋ฉด, ProviderNotFoundException ์˜ค๋ฅ˜์™€ ํ•จ๊ป˜ ์ธ์ฆ์ด ์‹คํŒจํ•œ๋‹ค.
  • ProviderNotFoundException : ProviderManager๊ฐ€ ์ „๋‹ฌ๋œ Authentication ์œ ํ˜•์„ ์ง€์›ํ•˜๋„๋ก ๊ตฌ์„ฑ๋˜์ง€ ์•Š์•˜์Œ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • AuthenticationProvider๋งˆ๋‹ค ๊ฐ์ž ๋งก์€ ์ธ์ฆ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

ProviderManager

 

  • ProviderManager์— ์ธ์ฆ์„ ์ˆ˜ํ–‰ํ•  AuthenticatinoProvider๊ฐ€ ์—†์„ ๊ฒฝ์šฐ, ๋ถ€๋ชจ AuthenticationManager ๊ตฌ์„ฑ์„ ํ—ˆ์šฉํ•œ๋‹ค.
  • ๋ถ€๋ชจ๋Š” ์–ด๋–ค ํƒ€์ž…์˜ AuthenticationManager๋“  ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์ฃผ๋กœ ProviderManager์˜ ์ธ์Šคํ„ด์Šค์ด๋‹ค.

 

ProviderManager - AuthenticationManager

 

  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ SecurityFilterChain ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ณตํ†ต์˜ ์ธ์ฆ(๊ฐ™์€ ๋ถ€๋ชจ AuthenticationManager)์„ ๊ฐ€์ง€์ง€๋งŒ ๋‹ค๋ฅธ ์ธ์ฆ ๋งค์ปค๋‹ˆ์ฆ˜(๋‹ค๋ฅธ ProviderManager ์ธ์Šคํ„ด์Šค)์ผ ๊ฒฝ์šฐ ๊ฐ™์€ ๋ถ€๋ชจ AuthenticationManager๋ฅผ ์—ฌ๋Ÿฌ ProviderManager๊ฐ€ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

multiple ProviderManager

 

  • ProviderManager๋Š” ์ธ์ฆ ์ดํ›„์˜ ๋ฆฌํ„ด๋œ Authentication ๊ฐ์ฒด์˜ ๋ชจ๋“  ๋ฏผ๊ฐํ•œ credential ์ •๋ณด๋Š” ์ œ๊ฑฐํ•˜๋ ค๊ณ  ์‹œ๋„ํ•œ๋‹ค.
  • password์™€ ๊ฐ™์€ ์ •๋ณด๊ฐ€ HttpSession์— ํ•„์š” ์ด์ƒ์œผ๋กœ ์˜ค๋ž˜ ๋‚จ์•„์žˆ๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค.
  • ํ•˜์ง€๋งŒ Authentication์— cache์˜ ๊ฐ์ฒด(ex. UserDetails)์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ credential ์ •๋ณด๋ฅผ ๋ชจ๋‘ ์ œ๊ฑฐํ•˜๋ฉด ์บ์‹œ๋œ ๊ฐ’์— ๋Œ€ํ•ด ๋” ์ด์ƒ ์ธ์ฆํ•  ์ˆ˜ ์—†๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.
  • ํ•ด๊ฒฐ์ฑ…์€ ์บ์‹œ ๊ตฌํ˜„ ๋˜๋Š” ๋ฐ˜ํ™˜๋œ Authentication ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” AuthenticationProvider์—์„œ ๋จผ์ € ๊ฐ์ฒด์˜ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค.
  • ๋˜ ๋‹ค๋ฅธ ํ•ด๊ฒฐ์ฑ…์œผ๋กœ๋Š” ProviderManager์˜ eraseCredentialsAfterAuthentication property๋ฅผ ๋น„ํ™œ์„ฑํ™” ํ•˜๋Š”๊ฒƒ์ด๋‹ค.

 

 

๐Ÿฐ AuthenticationProvider

๋‹ค์ˆ˜์˜ AuthenticationProvider๋ฅผ ProviderManager์— ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฐ๊ฐ์˜ AuthenticationProvider๋Š” ํŠน์ • ์œ ํ˜•์˜ ์ธ์ฆ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

ex) DaoAuthenticationProvider : username/password ๊ธฐ๋ฐ˜์˜ ์ธ์ฆ์„ ์ง€์›ํ•œ๋‹ค.

JwtAuthenticationProvider : JWT ํ† ํฐ ์ธ์ฆ์„ ์ง€์›ํ•œ๋‹ค.

 

 

๐Ÿฐ Request Credentials with AuthenticationEntryPoint

AuthenticationEntryPoint๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์ž๊ฒฉ์ฆ๋ช… ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต HTTP๋ฅผ ๋ณด๋‚ด๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

๋˜ํ•œ ํด๋ผ์ด์–ธํŠธ์— ์ž๊ฒฉ์ฆ๋ช…์„ ์š”์ฒญํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

AuthenticationEntryPoint์˜ ๊ตฌํ˜„์ฒด๋Š” ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋””๋ ‰์…˜ํ•˜๊ฑฐ๋‚˜ WWW-Authenticate header๋ฅผ ์ „์†กํ•˜๋Š” ๊ฒƒ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

 

๐Ÿฐ AbstractAuthenticationProcessingFilter

์‚ฌ์šฉ์ž์˜ credentials๋ฅผ ์ธ์ฆํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ์ดˆ Filter๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

credentials์ด ์ธ์ฆ๋˜๊ธฐ ์ „์—, Spring Security๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ AuthenticationEntryPoint๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ credentials์„ ์š”์ฒญํ•œ๋‹ค.

์—ฌ๋Ÿฌ component๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ์‹ฌ๋„์žˆ๋Š” ์ธ์ฆ ํ”Œ๋กœ์šฐ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

์ฐธ๊ณ ) Servlet Authentication Architecture

์ฐธ๊ณ ) Spring Security doc

 

 

 

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์˜ค๊ฐœ๋…์— ๋Œ€ํ•œ ์ง€์ ์€ ๋Š˜ ํ™˜์˜์ž…๋‹ˆ๋‹ค. ๐Ÿ˜ƒ