Spring Security

[Spring Security] ์ธ์ฆ๊ณผ ์ธ๊ฐ€, Spring Security ๊ตฌ์กฐ ๋œฏ์–ด๋ณด๊ธฐ, ๋กœ๊ทธ์ธ ํ๋ฆ„ ๋œฏ์–ด๋ณด๊ธฐ

์šฐ์ฃผ๋ฌผ๊ณ ๊ธฐ 2025. 5. 3. 15:10
๋ฐ˜์‘ํ˜•

์Šคํ”„๋ง๋ถ€ํŠธ๋กœ ํ”„๋กœ์ ํŠธ ๋งŒ๋“œ๋Š” ์ค‘์ธ๋ฐ

ํšŒ์›๊ฐ€์ž…, ๋กœ๊ทธ์ธ, ๋กœ๊ทธ์•„์›ƒ ๊ธฐ๋Šฅ ๋งŒ๋“ค๋ ค๋ฉด

์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋ฅผ ์•Œ์•„์•ผํ•จ

โ€‹

์ „๊ณต๊ณผ๋ชฉ์œผ๋กœ ์ •๋ณด๋ณด์•ˆ ๊ณผ๋ชฉ ๋“ค์—ˆ์—ˆ๋Š”๋ฐ

๊ทธ ๋•Œ ๋‚˜์™”๋˜ ์ธ์ฆ, ์ธ๊ฐ€๊ฐ€ ์—ฌ๊ธฐ์„œ๋„ ๋‚˜์˜ด

ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹

 


์ธ์ฆ๊ณผ ์ธ๊ฐ€
authentication, authorization

 

์ธ์ฆ : ์‚ฌ์šฉ์ž์˜ ์‹ ์›์„ ์ž…์ฆํ•˜๋Š” ๊ณผ์ •. ๋ˆ„๊ตฌ์ธ์ง€ ํ™•์ธํ•˜๋Š” ๊ณผ์ •์„ ์ธ์ฆ์ด๋ผ๊ณ  ํ•จ

โ€‹

์ธ๊ฐ€ : ํŠน์ • ๋ถ€๋ถ„์— ์ ‘๊ทผ ๊ถŒํ•œ ๊ฐ–๊ณ  ์žˆ๋‚˜ ์•„๋‹Œ๊ฐ€ ํ™•์ธํ•˜๋Š” ๊ณผ์ •.

(์˜ˆ๋ฅผ ๋“ค์–ด ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€๋Š”, ๊ด€๋ฆฌ์ž๋งŒ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์Œ)

โ€‹

-> ์ด ์ผ๋ จ์˜ ๊ณผ์ •์„ ๊ฑ ์ฝ”๋“œ๋กœ ํ•˜๋ ค๋ฉด ์˜ค๋ž˜๊ฑธ๋ฆผ

--> ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ์“ฐ๋ฉด ์‰ฝ๊ฒŒ ๊ตฌํ˜„ ๊ฐ€๋Šฅ

 

 


์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ
Spring Security

 

์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋Š” ์Šคํ”„๋ง ๊ธฐ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ณด์•ˆ์„ ๋‹ด๋‹นํ•˜๋Š”

์Šคํ”„๋ง ํ•˜์œ„ ํ”„๋ ˆ์ž„์›Œํฌ์ž„.

๋ณด์•ˆ ๊ด€๋ จ ์˜ต์…˜๋“ค ์ œ๊ณต

โ€‹

+ ์• ๋„ˆํ…Œ์ด์…˜ ์„ค์ •๋„ ์‰ฌ์šดํŽธ.

CSRF๊ณต๊ฒฉ, ์„ธ์…˜๊ณ ์ • ๊ณต๊ฒฉ ๋ฐฉ์–ดํ•ด์ฃผ๊ณ 

์š”์ฒญ header ๋ณด์•ˆ ์ฒ˜๋ฆฌ๋„ ํ•ด์ค˜์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง€์–ด์•ผ ํ•˜๋Š” ๋ถ€๋‹ด์„ ํฌ๊ฒŒ ์ค„์—ฌ์คŒ.

โ€‹

โ€‹

โ€‹

์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋Š” ํ•„ํ„ฐ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•จ

โ€‹

๋‹ค์–‘ํ•œ ํ•„ํ„ฐ๋“ค์ด ์žˆ๋Š”๋ฐ, ๊ฐ ํ•„ํ„ฐ์—์„œ

์ธ์ฆ, ์ธ๊ฐ€ ๊ด€๋ จ๋œ ์ž‘์—… ์ฒ˜๋ฆฌํ•จ.

 

 

์ถœ์ฒ˜ : ์Šคํ”„๋ง๋ถ€ํŠธ3 ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž ๋˜๊ธฐ (๊ณจ๋“  ๋ž˜๋น—)

์™ผ์ชฝ ์„ธ๋กœ๋กœ ๊ธธ์ญ‰ํ•œ ํ•„ํ„ฐ ์œ„์—์„œ ์•„๋ž˜๋กœ ๋‚ด๋ ค์˜ค๋Š” ์ˆœ์„œ์ธ๋“ฏ.

โ€‹

ํ•œ ๋ ˆ์ด์–ด์”ฉ ํ•„ํ„ฐ ์ž‘๋™ ํ• ๋•Œ๋งˆ๋‹ค, ์—ฐ๊ฒฐ๋œ ์˜ค๋ฅธ์ชฝ ํด๋ž˜์Šค๋ฅผ ๊ฑฐ์น˜๋ฉฐ ์‹คํ–‰ํ•จ.

ํŠน์ • ํ•„ํ„ฐ๋Š” ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜, ์ปค์Šคํ…€ํ•˜๋Š” ๋“ฑ ์„ค์ •๋„ ๊ฐ€๋Šฅ.

โ€‹

์—ฌ๊ธฐ์„œ ํšŒ์ƒ‰์œผ๋กœ ์น ํ•ด์ง„

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();

์ด๋ ‡๊ฒŒ ๊บผ๋‚ด์„œ ๋น„๊ต.

๋ฐ˜์‘ํ˜•