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

๋‹น์‹ ์˜ ์ฒซ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ํ†บ์•„๋ณด๊ธฐ

by ํŒกํŽ‘ํ 2024. 7. 6.
728x90
 ๐Ÿ™‡๐Ÿป‍โ™‚๏ธ ์•ˆ๋…•ํ•˜์„ธ์š”. ์ €๋Š” ๋ถ€ํŠธ์บ ํ”„๋ฅผ ๋‚˜์™€์„œ ๊ฐœ๋ฐœ์ž๋กœ ์ผํ•˜๊ณ  ์žˆ๋Š” ์‚ฌ๋žŒ์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ ์ƒ๊ฐํ•ด ๋ณด๋ฉด ๋ถ€ํŠธ์บ ํ”„ ๋ฉ”์ธ ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„ ๋•Œ ๊ฐ€์žฅ ๊ณจ์น˜ ์•„ํ”„๊ณ  ํž˜๋“ค์—ˆ๋˜ ๊ฒŒ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ์˜€๋˜ ๊ฒƒ ๊ฐ™์•„์š”. ๋‹น์‹œ์— ๋ง‰์ƒ ๋งŒ๋“ค์–ด ๋†“๊ณ  ์ดํ•ด๋„ ์ž˜ ๋ชปํ•˜๊ณ  ํŒ€์›๋“ค์—๊ฒŒ ์„ค๋ช…ํ•˜๊ธฐ ์–ด๋ ค์›Œํ–ˆ๋˜ ๊ธฐ์–ต์ด ๋‚ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์–ธ์  ๊ฐ€ ํ”„๋กœ์ ํŠธ๋ฅผ ์ฒ˜์Œ ํ•˜์‹œ๋Š” ๋ถ„๋“ค์„ ์œ„ํ•ด ์ž˜ ๋ชฐ๋ผ๋„ ๋”ฐ๋ผ ํ•  ์ˆ˜ ์žˆ๋Š” ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ๊ธ€์„ ์จ์•ผ๊ฒ ๋‹ค ์ƒ๊ฐ์„ ํ–ˆ๋Š”๋ฐ ๊ทธ๊ฑธ ์ด์ œ์•ผ ํ•˜๊ฒŒ ๋๋„ค์š”. ์•„๋ฌดํŠผ ์ž˜ ๋ชฐ๋ผ๋„, ์ง€๋‚˜๊ฐ€๋Š” ํ• ๋จธ๋‹ˆ๊ป˜ ๋‹ค์งœ๊ณ ์งœ ์„ค๋ช…ํ•ด๋„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 ์—ฌ๊ธฐ์„œ๋Š” ์›น, ์•ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ์˜ ๋กœ๊ทธ์ธ, ๋กœ๊ทธ์•„์›ƒ ๊ตฌํ˜„์„ ์œ„ํ•ด ํ•„์š”ํ•œ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ(Spring Security)์˜ ๋™์ž‘ ์›๋ฆฌ์— ๋Œ€ํ•œ ์งค๋ง‰ํ•œ ๊ฐœ๋…๊ณผ ์„ค๋ช…์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ธ€๋ถ€ํ„ฐ๋Š” ํ•˜๋‚˜ํ•˜๋‚˜ ๋งŒ๋“ค์–ด๋ณด๋ฉฐ ์ตœ์ข…์ ์œผ๋กœ๋Š” redis๋ฅผ ์ด์šฉํ•œ access, refresh token ๊ด€๋ฆฌ๊นŒ์ง€ ์„ค๋ช…ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 ์ œ ๊ธ€๋งŒ ๋ณด๊ณ  ๋”ฐ๋ผ ํ•ด๋„ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ๊ตฌํ˜„์— ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์—†๋„๋ก ์นœ์ ˆํ•˜๊ฒŒ ์„ค๋ช…ํ•ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

์›๋ฆฌ๋‚˜ ๊ฐœ๋…์— ๋Œ€ํ•ด์„œ๋Š” ์ €๋„ ์ž˜ ๋ชฐ๋ผ์„œ ์„ค๋ช…์ด ๋ถ€์‹คํ•˜๊ฑฐ๋‚˜, ํ‹€๋ฆด ์ˆ˜ ์žˆ๋‹ค๋Š” ์  ์–‘ํ•ด๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

 

๐Ÿ› ๏ธ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ์˜ ๋™์ž‘ ์•„ํ‚คํ…์ฒ˜

<๊ตฌ๊ธ€ ์ด๋ฏธ์ง€์—์„œ ๊ฒ€์ƒ‰ํ•˜๋ฉด ํ”ํžˆ ๋‚˜์˜ค๋Š” ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ์ธ์ฆ ์•„ํ‚คํ…์ฒ˜>

1. Http Request -> AuthenticationFilter

 ์ผ๋ฐ˜์ ์œผ๋กœ ์›น์ด๋“  ์•ฑ์ด๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ๋•Œ Http(s)๋กœ ํ†ต์‹ ํ•˜์ž–์•„์š”. ๊ทธ๋Ÿฌ๋‹ˆ ์—ฌ๋Ÿฌ๋ถ„์ด ์›น ํŽ˜์ด์ง€์—์„œ ๋กœ๊ทธ์ธ ํ™”๋ฉด์„ ๊ตฌํ˜„์„ ํ•˜๋ฉด id์™€ Password๋ฅผ ์œ ์ €๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์„ํ…๋ฐ ๊ทธ๊ฑธ ๋‚˜ํƒ€๋‚ด๊ณ  ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. 1๋ฒˆ์€ ํด๋ผ์ด์–ธํŠธ์—์„œ ์ž…๋ ฅํ•œ id์™€ password๊ฐ€ ์ž๋ฐ”์˜ ์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ๋กœ ๋“ค์–ด๊ฐ€๋Š” ๋ถ€๋ถ„์„ ํ‘œํ˜„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ’ก ์„œ๋ธ”๋ฆฟ์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์š”์•ฝ ์„ค๋ช…
์„œ๋ธ”๋ฆฟ์ด๋ž€ ์ž๋ฐ”์—์„œ ์›น ํ†ต์‹ ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ๊ธฐ์ˆ ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๋Š” ์ด๋Ÿฌํ•œ ์„œ๋ธ”๋ฆฟ์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ•ฉ๋‹ˆ๋‹ค.

 

ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ์˜ ํ†ต๊ณผ ์ˆœ์„œ

ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ: ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ € ๋“ฑ)๊ฐ€ ์„œ๋ฒ„๋กœ HTTP ์š”์ฒญ(ex. http body์— id, password๋ฅผ ์‹ฃ์Œ)์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ: ์š”์ฒญ์ด ์„œ๋ฒ„์— ๋„์ฐฉํ•˜๋ฉด, ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ(Tomcat, Jetty ๋“ฑ)๊ฐ€ ์š”์ฒญ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.

์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ: ์š”์ฒญ์ด ์„œ๋ธ”๋ฆฟ์— ๋„๋‹ฌํ•˜๊ธฐ ์ „์—, ์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ๊ฐ€ ์š”์ฒญ์„ ๊ฐ€๋กœ์ฑ•๋‹ˆ๋‹ค. ์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ๋Š” ์š”์ฒญ ๋ฐ ์‘๋‹ต์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ธ์ฆ, ๋กœ๊น…, ์••์ถ• ๋“ฑ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ: ์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ๋ฅผ ํ†ต๊ณผํ•œ ์š”์ฒญ์€ ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ(DispatcherServlet)์œผ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์€ ์Šคํ”„๋ง MVC์˜ ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ๋กœ, ๋ชจ๋“  ์š”์ฒญ์„ ์ค‘์•™์—์„œ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

ํ•ธ๋“ค๋Ÿฌ ๋งคํ•‘: ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์€ ์š”์ฒญ URL์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์–ด๋–ค ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ• ์ง€ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ํ•ธ๋“ค๋Ÿฌ ๋งคํ•‘(Handler Mapping)์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ธํ„ฐ์…‰ํ„ฐ: ํ•ธ๋“ค๋Ÿฌ ๋งคํ•‘์ด ์™„๋ฃŒ๋˜๋ฉด, ์š”์ฒญ์€ ์ธํ„ฐ์…‰ํ„ฐ(Interceptor) ์ฒด์ธ์„ ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค. ์ธํ„ฐ์…‰ํ„ฐ๋Š” ์š”์ฒญ ์ฒ˜๋ฆฌ ์ „ํ›„์— ์ถ”๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ธ์ฆ, ๊ถŒํ•œ ๋ถ€์—ฌ ๋“ฑ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ปจํŠธ๋กค๋Ÿฌ: ์ธํ„ฐ์…‰ํ„ฐ๋ฅผ ํ†ต๊ณผํ•œ ์š”์ฒญ์€ ์‹ค์ œ๋กœ ์ปจํŠธ๋กค๋Ÿฌ(Controller)๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ์ ์ ˆํ•œ ๋ชจ๋ธ๊ณผ ๋ทฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

 ์œ„์˜ ์š”์ฒญ ํ†ต๊ณผ ์ˆœ์„œ๋ฅผ ์ดํ•ดํ•˜์‹œ๋ฉด ๋ฌด๋ฆฌ ์—†์ด ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ id, password๊ฐ€ AuthenticationFilter๋กœ ๋“ค์–ด์˜จ ๋‚ด์šฉ์„ ์ƒ์ƒํ•˜์‹ค ์ˆ˜ ์žˆ์„ ๊ฒ๋‹ˆ๋‹ค.(๋งŒ์•ฝ ์ดํ•ด๊ฐ€ ์•ˆ๊ฐ€์‹ ๋‹ค๋ฉด Spring MVC์˜ ๋™์ž‘ ๊ตฌ์กฐ์— ๋Œ€ํ•ด ๊ตฌ๊ธ€๋งํ•ด๋ณด์„ธ์š”!) AuthenticationFilter๊ฐ€ ๋ฐ”๋กœ ์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค!! ์—ฌ๊ธฐ์„œ ์š”์ฒญ์„ ๊ฐ€๋กœ์ฑ„์–ด ํ•ด๋‹น ์š”์ฒญ์— ๋Œ€ํ•œ ๋กœ๊ทธ์ธ ์ธ์ฆ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด์ฃ ! ์ดํ•ด ๋ชป ํ•˜์…”๋„ ๋ฉ๋‹ˆ๋‹ค ใ…Žใ…Ž '์•„ ์ธ์ฆ์€ ์‹ค์ œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„ ์ „์— ํ•„ํ„ฐ๋ฅผ ๊ฑฐ์ณ ์ฒ˜๋ฆฌ๋˜๋Š”๊ตฌ๋‚˜'๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. 

 

  • 1๋ฒˆ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ €ํฌ๊ฐ€ ๋งŒ๋“  ์›น, ์•ฑ์˜ ๋กœ๊ทธ์ธ ํผ์—์„œ ์ž์‹ ์˜ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๊ทธ ๋ฐ์ดํ„ฐ๊ฐ€ json ํ˜•์‹์œผ๋กœ ์„œ๋ฒ„๋กœ ๋„˜์–ด์˜ฌ ๊ฒ๋‹ˆ๋‹ค.
{
    "id" : "myid111",
    "passeord" : 123456
}
  • ์ด๋Ÿฐ์‹์œผ๋กœ์š”. ์ด ๋•Œ ์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ์ธ AuthenticationFilter๊ฐ€ ํ•ด๋‹น ์š”์ฒญ์„ ๊ฐ€๋กœ ์ฑˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

2. AuthenticationFilter -> UsernamePasswordAuthenticationToken

  • ๊ทธ ๋‹ค์Œ์€ 2๋ฒˆ, ๊ฐ€๋กœ ์ฑˆ ์š”์ฒญ์œผ๋กœ ๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผ๊ฒ ์ฃ ?
  • ์š”์ฒญ body์— ๋‹ด๊ฒจ ์žˆ๋Š” ์‚ฌ์šฉ์ž ์ด๋ฆ„๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ UsernamePasswordAuthenticationToken๋ผ๋Š” ๊ฐ์ฒด์— ๋‹ด์•„ ์ธ์ฆ ์š”์ฒญ์„ ํ•˜๊ธฐ ์œ„ํ•œ ์ค€๋น„๋ฅผ ํ•˜๋Š” ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.
    • json ํ˜•ํƒœ๋ฅผ ์ž๋ฐ” ๊ฐ์ฒด๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ์—ญ์ง๋ ฌํ™”(Deserialization) ์ž‘์—…์„ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ๊ฐ์ฒด์— ๋‹ด์•„์•ผ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ์˜ AuthenticationManager๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • AuthenticationManager์—์„œ๋Š” UsernamePasswordAuthenticationToken ์•ˆ์— ์žˆ๋Š” ์‚ฌ์šฉ์ž์˜ ๋กœ๊ทธ์ธ ์ •๋ณด๋ฅผ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ด๊ฑธ ์™œ ํ•˜๋ƒ๊ตฌ์š”? ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๊ฐ€ ๋งŒ๋“ค์–ด ๋†“์€ ์ธ์ฆ ์ฒด๊ณ„๋ฅผ ์ €ํฌ๊ฐ€ ๋”ฐ๋ฅด๊ธฐ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•ด์•ผ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๊ฐ€ ๊ท€์ฐฎ์€ ์ž‘์—…์„ ์•Œ์•„์„œ ๋‹ค ํ•ด์ฃผ๋‹ˆ๊นŒ์š”.

 

3. UsernamePasswordAuthenticationToken -> AuthenticationManager(ProviderManager)

๐Ÿ’ก ์ธํ„ฐํŽ˜์ด์Šค
์ธํ„ฐํŽ˜์ด์Šค๋ž€ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๋ฉ”์„œ๋“œ์˜ ๋ชฉ๋ก์„ ์ •์˜ํ•˜๋Š” ์ผ์ข…์˜ ๋ชฉ์ฐจ์ž…๋‹ˆ๋‹ค.
์ธํ„ฐํŽ˜์ด์Šค ์ž์ฒด๋Š” ์‹ค์ œ ๊ตฌํ˜„ ๋‚ด์šฉ(๋กœ์ง ์ฝ”๋“œ)์„ ํฌํ•จํ•˜์ง€ ์•Š๊ณ , ๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜(๋ฉ”์„œ๋“œ ์ด๋ฆ„, ๋ฐ˜ํ™˜ ํƒ€์ž…, ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ชฉ๋ก)๋งŒ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ €ํฌ๊ฐ€ ์ฑ…์„ ๋ณด๋ฉด ๋ชฉ์ฐจ๊ฐ€ ์žˆ์ž–์•„์š”? ๊ทธ ๋ชฉ์ฐจ๋งŒ ์žˆ๋Š” ๊ฒ๋‹ˆ๋‹ค.
'์•ˆ์— ๋‚ด์šฉ์€ ๋„ค๊ฐ€ ๊ทœ์น™(๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜)์— ๋งž์ถฐ ์•Œ์•„์„œ ๊ตฌํ˜„ํ•˜์„ธ์š”.' ์ด ๋ง์ž…๋‹ˆ๋‹ค.

 

  • ์ด ๋ถ€๋ถ„์€ UsernamePasswordAuthenticationToken์˜ ๋กœ๊ทธ์ธ ์ •๋ณด๋กœ ๋กœ๊ทธ์ธ ์ธ์ฆ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” AuthenticationManager์˜ ๊ตฌํ˜„์ฒด์ธ ProviderManager๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๊ฑธ ์ง์ ‘ ๋งŒ๋“ค๊ฑฐ๋‚˜, ์ด๋ฏธ ๋งŒ๋“ค์–ด์ ธ ์žˆ๋Š” ๊ตฌํ˜„์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์…”๋„ ๋ฉ๋‹ˆ๋‹ค. ์ž˜ ๋ชจ๋ฅด์…”๋„ ์ผ๋‹จ ๋„˜์–ด๊ฐ€์‹œ๊ณ  ์ด ๋ถ€๋ถ„์„ ๊ตฌํ˜„ํ•  ๋•Œ ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.
  • ์ง€๊ธˆ์€ ๊ฐ„๋‹จํžˆ ProviderManager๊ฐ€ ๋กœ๊ทธ์ธ ์ธ์ฆ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•œ ๋งค๋‹ˆ์ €๋กœ์„œ์˜ ์—ญํ• ์„ ๋ถ€์—ฌ๋ฐ›๋Š” ์ˆœ๊ฐ„์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

4. AuthenticationManager(ProviderManager) -> AuthenticationProvider

  •  ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด AuthenticationManager์˜ ๊ตฌํ˜„์ฒด์ธ ProviderManager๊ฐ€ ๋งค๋‹ˆ์ €๋กœ์„œ์˜ ์—ญํ• ์„ ๋ถ€์—ฌ๋ฐ›์Šต๋‹ˆ๋‹ค.
  •  ๊ทธ๋ฆฌ๊ณ  UsernamePasswordAuthenticationToken์— ๋“ค์–ด์žˆ๋Š” id์™€ password๋ฅผ, ์ธ์ฆ์„ ์ฒ˜๋ฆฌํ•ด ์ฃผ๋Š” AuthenticationProvider(์ธ์ฆ ์ฒ˜๋ฆฌ ์ œ๊ณต์ž)์—๊ฒŒ 'id์™€ password๋ฅผ ๋“œ๋ฆด ํ…Œ๋‹ˆ ์ด ์ •๋ณด๋กœ ์ €ํฌ ํšŒ์›์ด ๋งž๋Š”์ง€ ํ™•์ธํ•ด ์ฃผ์„ธ์š”.'๋ผ๊ณ  ์˜ค๋”๋ฅผ ๋‚ด๋ฆฌ๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.
    • AuthenticationProvider๋Š” ๋งค๋‹ˆ์ €์˜ ์˜ค๋”๋ฅผ ๋ฐ›๊ณ  ์‚ฌ์šฉ์ž์˜ id์™€ password๋ฅผ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.
  • ์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ๋Š” ์ดํ•ด๋ฅผ ๋•๊ธฐ ์œ„ํ•ด ๋น„์œ ๋ฅผ ๋“ค๊ฒ ์Šต๋‹ˆ๋‹ค. 
  • 4๋ฒˆ์€ ๋งค๋‹ˆ์ €(AuthenticationManager)๊ฐ€ ์ง์ ‘ ์ธ์ฆ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š๊ณ , ์ค‘๊ฐ„ ์ง์›(AuthenticationProvider)์—๊ฒŒ ์ธ์ฆ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋ผ๊ณ  ์˜ค๋”๋งŒ ๋‚ด๋ฆฌ๋Š” ์—ญํ• ์ž„์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ํฌ์ธํŠธ์ž…๋‹ˆ๋‹ค.

 

5. AuthenticationProvider -> UserDetailsService

  • ๋งค๋‹ˆ์ €์—๊ฒŒ ์˜ค๋”๋ฅผ ๋ฐ›์€ ์ค‘๊ฐ„ ์ง์›(AuthenticationProvider)์€ ์‚ฌ์šฉ์ž์˜ id์™€ password๋ฅผ ๊ฒ€์ฆํ•  ๋•Œ ์ž์‹ ์ด ์ง์ ‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ด๋ฅผ ๋˜ ๋ง๋‹จ์ง์›(UserDetailsService)์—๊ฒŒ ์‹œํ‚ต๋‹ˆ๋‹ค.(ํ•˜์ฒญ์˜ ํ•˜์ฒญ์˜ ํ•˜์ฒญ..)
    • UserDetailsService๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ์„œ loadUserByUsername๋ผ๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๊ฐ์ด ์˜ค์‹œ๋‚˜์š”? loadUser(์œ ์ €์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์˜จ๋‹ค.), ByUsername(์œ ์ €์˜ ์ด๋ฆ„์œผ๋กœ๋ถ€ํ„ฐ) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— username์„ ๋„˜๊ธฐ๊ณ  ์œ ์ €์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์˜ค๋Š” ๋ฉ”์„œ๋“œ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.
    • ์ด๋•Œ username์€ ๋ฌด์—‡์ผ๊นŒ์š”? ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ๋ฐ›์€ id์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์˜ id๋ฅผ ์ฃผ๊ณ  ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์˜ฌ ๋•Œ password๋„ ํฌํ•จ๋˜์–ด ์žˆ์„ ํ…Œ๋‹ˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ password์™€ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ๋ฐ›์€ password๋ฅผ ๋น„๊ตํ•˜์—ฌ ์ธ์ฆ ํ†ต๊ณผ or ์‹คํŒจ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

6. UserDetailsService -> UserDetails

Member member = memberRepository.findByUsername(username);
  • ๋ง๋‹จ ์ง์›(UserDetailsService)์€ ์ด์ œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊บผ๋‚ธ id, password๋ฅผ UserDetails๋ผ๋Š” ํ‹€์— ๋งž์ถฐ ๋‹ด์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฐ›์€ id, password ์ •๋ณด์™€, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‚ด์˜ id, password๊ฐ€ ์ผ์น˜ํ•˜๋Š”์ง€ ๊ฒ€์ฆ์„ ํ•˜๊ณ , ์ด ๊ฒฐ๊ณผ๋ฅผ ์ค‘๊ฐ„ ์ง์›(AuthenticationProvider)์—๊ฒŒ ๋„˜๊ธฐ๋Š” ์ž‘์—…์„ ํ•ฉ๋‹ˆ๋‹ค.
    • ์œ„์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์˜ค๋ฉด ์—”ํ‹ฐํ‹ฐ ์ธ์Šคํ„ด์Šค์— ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ ์žˆ๊ฒ ์ฃ ?
      • ์•„๋งˆ JPA๋ฅผ ์“ฐ์‹œ๋Š” ๋ถ„๋“ค์€ Spring Data Jpa์˜ findByUsername์™€ ๊ฐ™์€ ์ฟผ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜์‹ค ๊ฑฐ๊ณ , ์•„๋‹ˆ๋ฉด sql๋ฌธ์œผ๋กœ ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค์‹ค ํ…๋ฐ์š”.
    • ๋ญ๊ฐ€ ๋๋“  ์ด ์ •๋ณด๋ฅผ UserDetails๋ผ๋Š” ์ƒˆ๋กœ์šด ๊ฐ์ฒด์— ์˜ฎ๊น๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ๊ฐ์ฒด์— ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ๋‹ด๋Š” ์ด์œ ๋Š” ์•ž์œผ๋กœ ์žˆ์„ ๋‹ค๋ฅธ ์ธ์ฆ์ด๋‚˜ ๊ถŒํ•œ ์ฒ˜๋ฆฌ ๋“ฑ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ์—์„œ์˜ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์— ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ entity ์ธ์Šคํ„ด์Šค๋ฅผ ์“ฐ๋ฉด ๋˜์ง€ ์•Š๋ƒ ํ•˜์‹ค ์ˆ˜ ์žˆ๋Š”๋ฐ ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ ์„ค๊ณ„๋ผ์„œ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.(์œ„๋ถ€ํ„ฐ ๊ณ„์† ํ•˜์ฒญ์˜ ํ•˜์ฒญ์ด ์ง€์†๋˜๊ณ , ๋ชจ๋“  ๋‹จ๊ณ„๋ฅผ ํ•˜๋‚˜์˜ ์—ญํ• ๋กœ ์ชผ๊ฐœ๋Š” ์ด์œ ๋Š” ๋ฐ”๋กœ ์Šคํ”„๋ง์ด ๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ ์„ค๊ณ„๊ฐ€ ๊ธฐ๋ณธ์œผ๋กœ ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. SOLID ์›์น™..)
      • ์ฐธ๊ณ ๋กœ UserDetails๋„ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๊ตฌํ˜„์ฒด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

 

7 ~ 10. SecurityContextHolder - Authentication

  • ์ธ์ฆ ์ฒ˜๋ฆฌ๊ฐ€ ๋์ด ๋‚˜๋ฉด ์—ญ์œผ๋กœ ๊ทธ๋Œ€๋กœ ๋Œ์•„๊ฐ€ SecurityContextHolder์˜ Authentication์— ์ธ์ฆ ์ •๋ณด๊ฐ€ ์‹ค๋ฆฝ๋‹ˆ๋‹ค. ์ด๋•Œ์˜ ์ธ์ฆ ์ •๋ณด๋Š” 6๋ฒˆ์˜ UserDetails๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  • ์œ„์˜ ๊ทธ๋ฆผ์—๋Š” ๋‚˜์™€ ์žˆ์ง€ ์•Š์ง€๋งŒ ์ด๋•Œ ์ธ์ฆ ์„ฑ๊ณต/์‹คํŒจ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ์„ฑ๊ณตํ•  ๋•Œ ์ˆ˜ํ–‰ํ•  ํ•ธ๋“ค๋Ÿฌ, ์‹คํŒจํ•  ๋•Œ ์ˆ˜ํ–‰ํ•  ํ•ธ๋“ค๋Ÿฌ๋กœ ๋„˜์–ด๊ฐ€ ๊ฐ ์ƒํ™ฉ์— ๋งž๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.
    • ์„ฑ๊ณตํ–ˆ์„ ๋•Œ๋Š” ์„ฑ๊ณตํ–ˆ๋‹ค๋Š” ์‘๋‹ต์„ ๋ณด๋‚ธ๋‹ค๋“ ๊ฐ€, ์‹คํŒจํ–ˆ์„ ๋•Œ๋Š” ๊ฐ ์—๋Ÿฌ์— ํ•ด๋‹นํ•˜๋Š” ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‘๋‹ต์„ ๋ณด๋‚ด๋Š” ์‹์œผ๋กœ ๊ฐ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋™์ž‘์‹œํ‚ค๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค.

 

๐Ÿ“œ ์ •๋ฆฌ

 1 ~ 10๋ฒˆ๊นŒ์ง€๋ฅผ ์งง๊ฒŒ ์š”์•ฝํ•˜๋ฉด '์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ id์™€ password๋ฅผ ๋ฐ›์•„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ž…๋ ฅ๋ฐ›์€ id๋กœ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ์ฐพ๊ณ  ์ž…๋ ฅ๋ฐ›์€ password์™€ ์ €์žฅ๋œ password๋ฅผ ๋น„๊ตํ•˜์—ฌ ์ธ์ฆ ์„ฑ๊ณต/์‹คํŒจ ์—ฌ๋ถ€์— ๋”ฐ๋ผ SecurityContextHolder์˜ Authentication์— ์ธ์ฆ ์ •๋ณด๋‚˜ ์ธ์ฆ ์˜ˆ์™ธ ์ •๋ณด๋ฅผ ์‹ฃ๋Š”๋‹ค. ์ดํ›„ ๊ฐ ์ƒํ™ฉ์— ๋งž๋Š” ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‹คํ–‰์‹œํ‚จ๋‹ค.'๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๊ฒ ๋„ค์š”.

 

 

๋™์ž‘ ์›๋ฆฌ์— ๋Œ€ํ•œ ์„ค๋ช…์„ ์ตœ๋Œ€ํ•œ ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ธ€๋ถ€ํ„ฐ๋Š” ์ง์ ‘ ๊ตฌํ˜„ํ•ด ๋ณด๋ฉด์„œ ์ดํ•ดํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

 

์ฐธ๊ณ 

๋คผํŠผ

https://velog.io/@kyungwoon/Spring-Security-Spring-Security-๋™์ž‘-์›๋ฆฌ

https://mangkyu.tistory.com/14

728x90