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

๋‹น์‹ ์˜ ์ฒซ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ(3) - AuthenticationManager, AuthenticationProvider, UserDetailsService, UserDetails

by ํŒกํŽ‘ํ 2024. 8. 4.
728x90
๐Ÿ“Œ ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” AuthenticationManager, AuthenticationProvider, UserDetailsService, UserDetails ๊ตฌํ˜„์— ๋Œ€ํ•ด ๋‹ค๋ฃน๋‹ˆ๋‹ค.

๐Ÿค— ์ €์˜ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ๊ตฌํ˜„์€ ์•„๋ž˜์™€ ๊ฐ™์€ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.
- ํ”„๋ก ํŠธ ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ๊ฐ€ ๋‚˜๋‰˜์–ด ์ง„ํ–‰๋˜๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์—ฌ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ์„ค์ •์—์„œ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ์„ค์ •์„ ๋”ฐ๋กœ ํ•˜์ง€ ์•Š์Œ
- JWT ํ† ํฐ ์ธ์ฆ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•จ
- ํ† ํฐ ๊ด€๋ฆฌ์— redis๋ฅผ ์ด์šฉํ•จ

 

๐Ÿ™‰ ์ด์ „ ๊ธ€ ๋ณด๊ธฐ

์ฒซ ๋ฒˆ์งธ ๊ธ€๋ถ€ํ„ฐ ์ •๋…ํ•˜์‹œ๋ฉด ๋ณด๋‹ค ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

https://suzuworld.tistory.com/438 - ๋‹น์‹ ์˜ ์ฒซ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ํ†บ์•„๋ณด๊ธฐ

์ด์ „ ๊ธ€

https://suzuworld.tistory.com/440 - ์ธ์ฆ ๋ฐฉ์‹ ๊ฐœ๋…๊ณผ AuthenticationFilter

 

๐Ÿ“– ๋ชฉ์ฐจ

์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ํ†บ์•„๋ณด๊ธฐ

SecurityConfig ๊ตฌ์„ฑํ•˜๊ธฐ

์ธ์ฆ ๋ฐฉ์‹ ๊ฐœ๋…๊ณผ AuthenticationFilter 

AuthenticationManager, AuthenticationProvider, UserDetailsService, UserDetails (ํ˜„์žฌ ๊ธ€)

 

๐Ÿšช๋“ค์–ด๊ฐ€๊ธฐ ์ „์—

  • ์ง€๋‚œ ๊ธ€์—์„œ๋Š” AuthenticationFilter๋ฅผ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • ์ด ํ•„ํ„ฐ์˜ ์—ญํ• ์€ "/login"์ด๋ผ๋Š” ์—”๋“œํฌ์ธํŠธ๋กœ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋•Œ ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ์ •๋ณด(์•„์ด๋””, ํŒจ์Šค์›Œ๋“œ)๋ฅผ ์„œ๋ฒ„์— ์ €์žฅ๋œ ์‚ฌ์šฉ์ž ์ •๋ณด์™€ ๋น„๊ตํ•˜์—ฌ ๋กœ๊ทธ์ธ์˜ ์„ฑ๊ณต/์‹คํŒจ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
    • ํ•ด๋‹น ์ผ์€ AuthenticationManager๋ผ๋Š” ๋…€์„์ด ๋Œ€์‹  ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ์š”.

 

@Slf4j
@RequiredArgsConstructor
public class JwtAuthenticationFilter extends UsernamePasswordAuthenticationFilter {

	private final AuthenticationManager authenticationManager;
    
    ...
    return authenticationManager.authenticate(authenticationToken);
}
  • ๊ทธ๋ž˜์„œ ์œ„์™€ ๊ฐ™์ด AuthenticationManager๋ฅผ ์˜์กด์„ฑ ์ฃผ์ž…๋ฐ›์•„ ์—ญํ•  ์ˆ˜ํ–‰์„ ๋Œ€์‹ ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์ด์ œ ์ด ํด๋ž˜์Šค๋ฅผ SecurityConfig์— ๋“ฑ๋กํ•˜๋Š” ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
    • SecurityConfig์— ๋“ฑ๋กํ•ด์„œ "/login" ์—”๋“œํฌ์ธํŠธ์— ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ์œ„ ํ•„ํ„ฐ๋ฅผ ํƒ€๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ๋˜, AuthenticationManager์™€ ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์ฒด ์ค‘  ์–ด๋–ค ๊ฑธ ์‚ฌ์šฉํ• ์ง€ ํ•œ ๊ณณ์—์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” AuthenticationFilter์™€ AutenticationManager์˜ ๊ตฌํ˜„์ฒด๋ฅผ Config์— ๋“ฑ๋กํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 

 

AuthenticationManager

  • AuthenticationManager๋ฅผ ์‚ดํŽด๋ณด๋ฉด ์ธํ„ฐํŽ˜์ด์Šค์ž„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ผ์ข…์˜ ์ฒญ์‚ฌ์ง„์ด์ฃ . ์ฆ‰, 'AuthenticationManager์—๋Š” ์ด๋Ÿฐ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋‹ค๋Š” ํ‘œ์ค€์„ ์ œ์‹œํ•ด ์ฃผ๊ณ , ํ•ด๋‹น ํ‘œ์ค€์„ ์ค€์ˆ˜ํ•˜์—ฌ ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์˜ ์ฝ”๋“œ ๊ตฌํ˜„ํ•ด๋ผ.'๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

  • ์‹ค์ œ๋กœ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ตฌํ˜„์ฒด๋Š” ์œ„์™€ ๊ฐ™์€ ๊ฒƒ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿผ '์ด ์ค‘์— ๋ญ˜ ์จ์•ผ ํ• ๊นŒ?'๋ผ๋Š” ๋ฌผ์Œ์ด ์ƒ๊ธธ ํ…๋ฐ์š”. 
  • ์ด ๋ฌผ์Œ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์€  Spring Security ๊ณต์‹ ๋ฌธ์„œ์— ์นœ์ ˆํžˆ ๋‚˜์™€์žˆ์Šต๋‹ˆ๋‹ค.

 

Spring Security Docs

https://docs.spring.io/spring-security/reference/servlet/authentication/architecture.html#servlet-authentication-authenticationmanager

  • ProviderManager is the most commonly used implementation of AuthenticationManager.๋ผ๊ณ  ๋‚˜์™€ ์žˆ๋„ค์š”. 
  • ์ด๋ฅผ Config์— ์ถ”๊ฐ€ํ•ด๋ด…์‹œ๋‹ค.

 

Spring Bean ๋“ฑ๋ก

  • SecurityConfig์— ์œ„์™€ ๊ฐ™์ด AuthenticaionManager์˜ ๊ตฌํ˜„์ฒด๋ฅผ Bean์œผ๋กœ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

 

ProviderManager ๋‚ด๋ถ€

  • ํ•ด๋‹น ํด๋ž˜์Šค ๋‚ด๋ถ€์— ๋“ค์–ด๊ฐ€๋ฉด ์œ„์™€ ๊ฐ™์ด ์ƒ์„ฑ์ž ๋ฉ”์„œ๋“œ์— ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ AuthenticationProvider์˜ ๊ตฌํ˜„์ฒด๋ฅผ ๋ฐ›๊ณ  ์žˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ“ƒ ์•„ํ‚คํ…์ฒ˜ ์ผ๋ถ€

  • ์•„ํ‚คํ…์ฒ˜์˜ 4๋ฒˆ์— ํ•ด๋‹นํ•˜๋Š” ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ ์ €ํฌ๋Š” Confing ๋‚ด์˜ ProviderManager์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์— AuthenticationProvider๋ฅผ ์ฃผ์ž…ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
    • ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” AuthenticationProvider์˜ ๊ตฌํ˜„์ฒด๋ฅผ ์˜์กด์„ฑ ์ฃผ์ž…ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

 

AuthenticationProvider์˜ ๊ตฌํ˜„์ฒด

  • ๊ณต์‹๋ฌธ์„œ์— ๋ณด๋ฉด DaoAuthenticationProvider๋Š” UserDetailService์™€ PasswordEncoder๋ฅผ ์ด์šฉํ•˜์—ฌ username(Id)์™€ password๋ฅผ ๊ฒ€์ฆํ•œ๋‹ค๊ณ  ๋‚˜์™€์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋”ฑ ์ €ํฌ๊ฐ€ ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋„ค์š”.
  • ๋”ฐ๋ผ์„œ, ์œ„ ์—ฌ๋Ÿฌ ๊ตฌํ˜„์ฒด ์ค‘์— ์ €ํฌ๊ฐ€ ์‚ฌ์šฉํ•  ๊ตฌํ˜„์ฒด๋Š” DaoAuthenticationProvider์ž…๋‹ˆ๋‹ค.

 

AuthenticationProvider ์Šคํ”„๋ง ๋นˆ ๋“ฑ๋ก

  • ์œ„์™€ ๊ฐ™์ด DaoAuthenticationProvider๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” AuthenticationProvider๋ฅผ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•˜๊ณ  ProviderManager์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์— ์‹ฃ์Šต๋‹ˆ๋‹ค.
  • ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด AuthenticationManager๊ฐ€ DaoAuthenticationProvider์—๊ฒŒ ๋กœ๊ทธ์ธ ์‹œ ์ž…๋ ฅ๋ฐ›์€ ์‚ฌ์šฉ์ž์˜ ์•„์ด๋””์™€ ํŒจ์Šค์›Œ๋“œ๋ฅผ ๊ฒ€์ฆํ•˜๋ผ๊ณ  ์‹œํ‚ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

ํ•„ํ„ฐ ์ถ”๊ฐ€

  • SecurityFilterChain์— JwtAuthenticationFilter์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ url ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋“ฑ๋กํ•˜๊ณ  ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ authenticationManager()๋ฅผ ๋„˜๊น๋‹ˆ๋‹ค.
  • ์ด์ œ ์œ„์˜ ๋กœ๊ทธ์ธ ํ•„ํ„ฐ๋Š” "/login"์ด๋ผ๋Š” ์—”๋“œํฌ์ธํŠธ๋กœ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ ํ•„ํ„ฐ๋งํ•˜์—ฌ ๋กœ๊ทธ์ธ ๊ฒ€์ฆ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ๋˜ํ•œ, ์ˆ˜ํ–‰ ์‹œ ๊ฒ€์ฆ ์—ญํ• ์€ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•œ ProviderManager๊ฐ€ DaoAuthenticationProvider์—๊ฒŒ ์‹œํ‚ค๋Š” ๊ฒƒ์œผ๋กœ ์œ„์˜ ์•„ํ‚คํ…์ฒ˜ ๋ชจ์Šต๊ณผ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿšจ UserDetailsService์™€ UserDetails

  • ์œ„ ์ƒํƒœ์—์„œ ๊ทธ๋Œ€๋กœ ์Šคํ”„๋ง๋ถ€ํŠธ๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ฉด UserDetailsService๊ฐ€ ๋ฐ˜๋“œ์‹œ ์„ธํŒ…๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • UserDetailsService๋ฅผ AuthenticationProvider์— ์„ธํŒ…ํ•ด์•ผ ํ•˜๋Š”๋ฐ์š”. ์ด ๊ณผ์ •์€ ๋””ํ…Œ์ผํ•œ ์„ค๋ช…์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋‹ค์‹œ ์‚ดํŽด๋ด…์‹œ๋‹ค.

 

๐Ÿค” ์•„ํ‚คํ…์ฒ˜ 

  • ์—ฌ๊ธฐ์„œ 5๋ฒˆ๋ถ€ํ„ฐ 8๋ฒˆ๊นŒ์ง€์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ๊ฐ„๋‹จํžˆ ์„ค๋ช…๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.
  • (5) AuthenticationProvider์˜ ๊ตฌํ˜„์ฒด๋Š” UserDetailsService๋ฅผ ํ†ตํ•ด
  • (6) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ User(Member) ํ…Œ์ด๋ธ”์—์„œ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€ UserDetails๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์ฒด์— ํ•ด๋‹น ์ •๋ณด๋ฅผ ์ฃผ์ž…ํ•˜๊ณ 
  • (7) ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿผ (8) AuthenticationProvider์˜ ๊ตฌํ˜„์ฒด๋Š” UserDetails์˜ ๊ตฌํ˜„์ฒด ์ •๋ณด์— ๋‹ด๊ธด ์‚ฌ์šฉ์ž์˜ ์ •๋ณด์™€ AuthenticationManager๊ฐ€ ๋„˜๊ธด ์ž…๋ ฅ๋ฐ›์€ ๋กœ๊ทธ์ธ ์ •๋ณด๋ฅผ ๋น„๊ตํ•˜์—ฌ ๋กœ๊ทธ์ธ ๊ฒ€์ฆ ์„ฑ๊ณต/์‹คํŒจ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
  • (9) AuthenticationManager๊ฐ€ ํ•„ํ„ฐ์— ๋กœ๊ทธ์ธ ๊ฒ€์ฆ ์—ฌ๋ถ€๋ฅผ ๋„˜๊ธฐ๋ฉด
  • ํ•„ํ„ฐ๋Š” ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์š”์ฒญํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ HTTP ์‘๋‹ต ๋ฉ”์‹œ์ง€๋ฅผ ๋งŒ๋“ค๊ณ  ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
    • ์ด ๋ถ€๋ถ„์€ ์•„ํ‚คํ…์ฒ˜์— ๋‚˜์™€์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

SecutiryConfig

  • ์ž, SecutiryConfig๋ฅผ ๋‹ค์‹œ ๋ณด๋ฉด ํ˜„์žฌ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•œ AuthenticationProvider์—๋Š” UserDetailsService์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ฃผ์ž…ํ•˜์ง€ ์•Š๊ณ  ์žˆ๋„ค์š”.
  • ์ •ํ™•ํžˆ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด ๊ตฌํ˜„์ฒด์ธ DaoAuthenticationProvider ๋‚ด๋ถ€๋ฅผ ์‚ดํŽด๋ด…์‹œ๋‹ค.

 

DaoAuthenticationProvider

  • ์„ ์–ธ๋œ ํ•„๋“œ๋ฅผ ๋ณด๋ฉด UserDetailsService๊ฐ€ ์žˆ๋„ค์š”.

 

  • ๋˜ํ•œ, ์ƒ์„ฑ์ž๋ฉ”์„œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ PasswordEncoder๊ฐ€ ํ•„์š”ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

 

  • doAfterPropertiesSet์ด๋ผ๋Š” ๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ ๋ณด๋‹ˆ properties ์„ธํŒ…์ด ๋๋‚œ ํ›„ ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๋ฉ”์„œ๋“œ์ธ ๊ฒƒ ๊ฐ™์€๋ฐ UserDetailsService๋ฅผ ์ฃผ์ž…๋ฐ›์ง€ ์•Š์œผ๋ฉด A UserDetailsService must be set์ด๋ผ๋Š” ๊ฒฝ๊ณ  ๋ฌธ๊ตฌ๋ฅผ ๋˜์ง€๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์•„ ์•„๊นŒ ์œ„์—์„œ ๋ณธ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€์— ํ•ด๋‹นํ•˜๋Š” ๋ฉ”์„œ๋“œ์ž„์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿคฏ ์ค‘๊ฐ„ ์ •๋ฆฌ

  • ์œ„์˜ ์ •๋ณด๋งŒ์œผ๋กœ ๋ฏธ๋ฃจ์–ด๋ณด๋ฉด DaoAuthenticationProvider๋Š” ์ตœ์†Œํ•œ PasswordEncoder์™€ UserDetailsService๋ฅผ ํ•„์š”๋กœ ํ•จ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • UserDetailsService๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ํ•ด๋‹น ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ์—์„œ ๊ตฌํ˜„ํ•œ UserDetails๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์ฒด์— ์ •๋ณด๋ฅผ ๋„ฃ๊ณ  ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿฐ๋ฐ PasswordEncoder๋Š” ๋„๋Œ€์ฒด ๋ฌด์—‡์ผ๊นŒ์š”?

 

PasswordEncoder

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

PasswordEncoder์˜ ๊ตฌํ˜„์ฒด

  • ํŒจ์Šค์›Œ๋“œ์˜ ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹์œผ๋กœ ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ๊ตฌํ˜„์ฒด๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” ๋ฌด์—‡์„ ์จ์•ผ ํ• ๊นŒ์š”?
  • ์ด๋ฅผ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด PasswordEncoder๋ฅผ ์™œ ์ธ์ฝ”๋”ฉํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ณต์‹๋ฌธ์„œ์—์„œ ์ฐพ์•„๋ด…์‹œ๋‹ค.

 

Spring Security ๊ณต์‹ ๋ฌธ์„œ

https://docs.spring.io/spring-security/reference/features/authentication/password-storage.html#page-title

  • ๋‚ด์šฉ์„ ์š”์•ฝํ•ด ๋ณด๋ฉด ์ด๋ ‡์Šต๋‹ˆ๋‹ค.
  • PasswordEncoder๋Š” ๋‹จ๋ฐฉํ–ฅ ์•”ํ˜ธํ™”๋กœ ์ธ์ฝ”๋”ฉํ•ฉ๋‹ˆ๋‹ค.
    • ์ฆ‰, ์•”ํ˜ธํ™”๋งŒ ๊ฐ€๋Šฅํ•˜๊ณ  ๋ณตํ˜ธํ™”๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ์ฒ˜์Œ์—๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ผ๋ฐ˜ ํ…์ŠคํŠธ ๊ทธ๋Œ€๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ–ˆ์ง€๋งŒ, ์ด๋Š” ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์— ์•ก์„ธ์Šค๋ฅผ ํ•˜๋Š” ๋ˆ„๊ตฐ๊ฐ€์— ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋…ธ์ถœ์‹œํ‚จ๋‹ค๋Š” ๋ฌธ์ œ๋กœ ์ด์–ด์กŒ์Šต๋‹ˆ๋‹ค.
  • ์ด ๋ฌธ์ œ๋Š” ๋‹จ์ˆœํžˆ ๋‚ด๋ถ€ ์ง์›์ผ ์ˆ˜๋„, SQL Injection๊ณผ ๊ฐ™์€ ์™ธ๋ถ€ ๊ณต๊ฒฉ์ž์ผ์ˆ˜๋„ ์žˆ์ฃ .
  • ๋”ฐ๋ผ์„œ ๋‹จ๋ฐฉํ–ฅ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•”ํ˜ธํ™”ํ•˜์—ฌ ์ €์žฅํ•œ ํ›„ ๋กœ๊ทธ์ธ ์‹œ ์ž…๋ ฅ๋ฐ›์€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ•ด์‹œํ•˜์—ฌ ์ €์žฅ๋œ ํ•ด์‹œ๊ฐ’๊ณผ ๋™์ผํ•œ์ง€ ๋น„๊ตํ•˜๋Š” ๋ฐฉ์‹์ด ์‚ฌ์šฉ๋˜์—ˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
  • ์ดˆ๊ธฐ์— ์‚ฌ์šฉ๋œ SHA-256๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜๋Š” ํ˜„๋Œ€์— ๋“ค์–ด ํ•˜๋“œ์›จ์–ด ๊ธฐ์ˆ ์˜ ๋ฐœ๋‹ฌ๋กœ ์‰ฝ๊ฒŒ ํ•ด๋…ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋‹จ์ ์ด ๋ฐœ๊ฒฌ๋˜์–ด ์ ์‘ํ˜• ๋‹จ๋ฐฉํ–ฅ ํ•จ์ˆ˜(adaptive one-way functions)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋Š” ์˜๋„์ ์œผ๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ฒŒ ํ•˜์—ฌ ์ž‘์—… ๊ณ„์ˆ˜๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์˜๋„์ ์œผ๋กœ ์•”ํ˜ธ ํ™•์ธ์„ ๋Š๋ฆฌ๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ์‹œ๋กœ๋Š” bcrypt, PBKDF2, scrypt, argon2 ๋“ฑ์ด ์žˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
  • ์ €ํฌ๋Š” ์ด ์ค‘์—์„œ bcrypt๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • bcrypt๋Š” ์ ์‘ํ˜• ๋‹จ๋ฐฉํ–ฅ ํ•จ์ˆ˜ ์ค‘ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์˜ˆ์‹œ๋กœ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๊ณ  ๋”ฑํžˆ ์ด์œ ๋Š” ์—†์Šต๋‹ˆ๋‹ค.

 

PasswordEncoder ์ ์šฉ

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

 

  • ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์ง€์šฐ๊ณ  PasswordEncoder๋ฅผ ์˜์กด์„ฑ ์ฃผ์ž…๋ฐ›์•„ ์ธ์ฝ”๋”ฉ ํ›„ ์ €์žฅํ•˜๋„๋ก ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿฐ๋ฐ, ์„ ์–ธ๋œ ํ•„๋“œ์— ๋นจ๊ฐ„์ƒ‰ ์ค„์ด ๊ทธ์–ด์ ธ ์žˆ๋„ค์š”.

 

  • ์Šคํ”„๋ง ๋นˆ์„ ๋“ฑ๋กํ•˜์ง€ ์•Š์•„์„œ ์ƒ๊ธด ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

 

SecurityConfig ์ˆ˜์ •

PasswordEncoder ์Šคํ”„๋ง ๋นˆ ๋“ฑ๋ก

  • SecurityConfig์—์„œ PasswordEncoder๋ฅผ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•˜์—ฌ ์ปดํŒŒ์ผ ์—๋Ÿฌ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

 

ํŒจ์Šค์›Œ๋“œ ์ธ์ฝ”๋”ฉ ํ™•์ธ

  • ํšŒ์› ๊ฐ€์ž… ๋กœ์ง์„ ํ…Œ์ŠคํŠธํ•ด๋ด…์‹œ๋‹ค.
  • ์ด์ „์—๋Š” password๊ฐ€ "bbb"์™€ ๊ฐ™์ด ํ‰๋ฌธ ๊ทธ๋Œ€๋กœ ์ €์žฅ๋˜์—ˆ๋Š”๋ฐ ํ•ด์‹œ ์•”ํ˜ธํ™”๋˜์–ด ์ €์žฅ๋จ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹ค์‹œ ๋Œ์•„์™€์„œ,
    • ์ €ํฌ๋Š” DaoAuthenticationProvider์˜ ์˜์กด์„ฑ ์ฃผ์ž…์„ ์œ„ํ•ด PasswordEncoder๋ฅผ ์•Œ์•„๋ณด๊ณ  ๊ตฌํ˜„์ฒด ์ค‘ ํ•˜๋‚˜์ธ BCryptPasswordEncoder๋ฅผ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋กํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ์ด์ œ UserDetailsService์™€ UserDetails ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ดํŽด๋ด…์‹œ๋‹ค.

 

UserDetailsService & UserDetails

  • UserDetailsService์˜ loadUserByUsername ๋ฉ”์„œ๋“œ๋ฅผ ๋ณด์•„ ์ง์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์‚ฌ์šฉ์ž์˜ username(id)๋ฅผ ๋„˜๊ธฐ๋ฉด ํ•ด๋‹น username์œผ๋กœ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ฐพ์•„ UserDetails์˜ ๊ตฌํ˜„์ฒด๋กœ ๋ฆฌํ„ดํ•˜๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์•„๋งˆ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ๊ฐœ๋…์ด ํ™•๋ฆฝ๋˜์‹  ๋ถ„๋“ค์€ ์ „ํ˜€ ์–ด๋ ต์ง€ ์•Š์„ ํ…๋ฐ ๋ฉ˜๋ถ•์— ๋น ์ง€์‹  ๋ถ„๋“ค๋„ ์žˆ์„ ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
  • ํŠนํžˆ ์ˆœ์„œ๊ฐ€ ๊ผฌ์ด๊ฑฐ๋‚˜ ๋†“์น˜์‹  ๋ถ„๋“ค์ด ์žˆ์„ ๊ฒƒ ๊ฐ™์€๋ฐ์š”.
  • ๊ทธ๋ž˜์„œ ๋งค์šฐ ๋””ํ…Œ์ผํ•˜๊ฒŒ ๋‹ค์‹œ ์„ค๋ช…ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ดํ•ดํ•˜์‹  ๋ถ„๋“ค์€ ๋„˜๊ธฐ์…”๋„ ๋ฉ๋‹ˆ๋‹ค.

 

๐Ÿ‘ฎ๐Ÿป‍โ™€๏ธ ๋ณด์ถฉ ์„ค๋ช…

  • ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋ณด๊ณ  ๋‹ค์‹œ ์ •๋ฆฌํ•ด ๋ด…์‹œ๋‹ค.
  • (0) ์•„ํ‚คํ…์ฒ˜์— ๋“ฑ์žฅํ•˜์ง€ ์•Š์ง€๋งŒ ์‚ฌ์šฉ์ž๊ฐ€ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ •ํ•˜๊ณ  ํšŒ์›๊ฐ€์ž…์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—๋Š” ํšŒ์› ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํฌํ•จํ•œ ์‚ฌ์šฉ์ž ์ •๋ณด๊ฐ€ ํ•จ๊ป˜ ์ €์žฅ๋˜๋ฉฐ ์ด๋•Œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” Bcrypt๋กœ ๋‹จ๋ฐฉํ–ฅ ์•”ํ˜ธํ™”๋˜์–ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • (1) Http Request๋กœ ์‚ฌ์šฉ์ž์˜ ๋กœ๊ทธ์ธ ์‹œ๋„ ์š”์ฒญ์ด ์™”์Šต๋‹ˆ๋‹ค. ์ด ์š”์ฒญ ๋ฉ”์‹œ์ง€ ์•ˆ์—๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ ์‹œ ์ž…๋ ฅํ•œ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๋‹ด๊ฒจ์žˆ์Šต๋‹ˆ๋‹ค.
  • (2) AuthenticationFilter๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๋กœ๊ทธ์ธ ์ •๋ณด(์•„์ด๋””, ๋น„๋ฐ€๋ฒˆํ˜ธ)๋ฅผ UsernamePasswordAuthenticationToken์— ๋‹ด์Šต๋‹ˆ๋‹ค.
  • (3) AuthenticationManager์—๊ฒŒ ๋งค๋‹ˆ์ € ์—ญํ• ์„ ๋ถ€์—ฌํ•˜๊ณ  UsernamePasswordAuthenticationToken์„ ์ฃผ๋ฉด์„œ ๋กœ๊ทธ์ธ ๊ฒ€์ฆ์„ ํ•˜๋ผ๊ณ  ์‹œํ‚ต๋‹ˆ๋‹ค.
  • (4) AuthenticationManager๋Š” ์ง€์‹œ์ž์ด๋ฉฐ, ์‹ค์ œ ๊ฒ€์ฆ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•  AuthenticationProvider์—๊ฒŒ ๋กœ๊ทธ์ธ ๊ฒ€์ฆ์„ ์ง€์‹œํ•ฉ๋‹ˆ๋‹ค. ์ €ํฌ๋Š” ์ด ์ค‘์— DaoAuthenticationProvider๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
  • (5) ์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ๋‚ด์šฉ์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. AuthenticationProvider๋Š” ํ˜„์žฌ ๋กœ๊ทธ์ธ ์‹œ ์ž…๋ ฅํ•œ ์ •๋ณด์ธ UsernamePasswordAuthenticationToken์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ํ•„์š”ํ•œ ๊ฑด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๊ฒ ์ฃ ?
    • ๊ทธ๋Ÿฐ๋ฐ, AuthenticationProvider๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•˜๋Š” ์ผ์„ ์ง์ ‘ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. UserDetailsService๋ผ๋Š” ๋…€์„์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋“ค์–ด๊ฐ€์„œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋ผ๊ณ  ์‹œํ‚ต๋‹ˆ๋‹ค.(ํ•˜์ฒญ์˜ ํ•˜์ฒญ์˜ ํ•˜์ฒญ์ž…๋‹ˆ๋‹ค.)
  • (6) UserDetailsService๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•˜์—ฌ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ํ•ด๋‹น ์ •๋ณด๋ฅผ UserDetails์˜ ๊ตฌํ˜„์ฒด์— ๋‹ด์•„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • (7) UserDetailsService๋Š” ์ด๋ฅผ AuthenticationProvider์—๊ฒŒ ์ œ๊ณตํ•˜์—ฌ ์‹ค์ œ ๋น„๊ต(๋กœ๊ทธ์ธ ๊ฒ€์ฆ)๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ๋‚˜์˜จ ๊ฒฐ๊ณผ๊ฐ€ ๋กœ๊ทธ์ธ ์„ฑ๊ณต/์‹คํŒจ ์—ฌ๋ถ€์ด๋ฉฐ ์ด๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ๊ฒƒ์ด์ฃ .

 

UserDetailsService & UserDetails ๊ตฌํ˜„์ฒด ๋งŒ๋“ค๊ธฐ

MemberDetailsService

  • ๋จผ์ € UserDetailsService์˜ ๊ตฌํ˜„์ฒด์ธ MemberDetailsService๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  • ์ดํ›„ loadUserByUsername ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ์ฑ„์›Œ ๋„ฃ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • ์ด ๊ตฌํ˜„์ฒด์˜ ์—ญํ• ์€ ๋ง ๊ทธ๋Œ€๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€ ๋„˜๊ธฐ๋Š” ๊ฒƒ์ธ๋ฐ์š”.
  • loadUserByUsername ๋ฉ”์„œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์€ username(id)๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜๋Š” ๋กœ์ง์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

MemberRepository

  • ์ด๋ฅผ ์œ„ํ•ด MemberRepository์— username(id)์œผ๋กœ Member๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

 

  • @Service ์• ๋„ˆํ…Œ์ด์…˜์œผ๋กœ ์Šคํ”„๋ง ๋นˆ์— ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.
  • MemberRepository๋ฅผ ์˜์กด์„ฑ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค.
  • ๊น”๋”ํ•œ ์ฝ”๋“œ๋ฅผ ์œ„ํ•ด @RequiredArgsConstructor๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
  • UsernameNotFoundException์˜ ๊ฒฝ์šฐ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ์—์„œ ์ œ๊ณตํ•˜๋Š” ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.
    • ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ๋Š” message๋ฅผ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— username์„ ํ†ตํ•ด ์–ด๋–ค username์ด ๊ฐ’์„ ๋ถˆ๋Ÿฌ์˜ค์ง€ ๋ชปํ–ˆ๋Š”์ง€ ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ด์ œ ๋‚จ์€ ๊ฑด UserDetails์˜ ๊ตฌํ˜„์ฒด์— Member ์—”ํ‹ฐํ‹ฐ์˜ ํ•„๋“œ ์ •๋ณด๋ฅผ ์˜ฎ๊ธฐ๋Š” ์ž‘์—…์ธ๋ฐ์š”.
  • ์™œ Member ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ๋„˜๊ธฐ์ง€ ์•Š๋Š”์ง€ ์˜๋ฌธ์ด ๋“œ์‹œ๋Š” ๋ถ„๋“ค์„ ์œ„ํ•ด ์„ค๋ช…์„ ๋“œ๋ฆฌ์ž๋ฉด, ์ด ๋ถ€๋ถ„ ์—ญ์‹œ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๊ฐ€ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ๋†“์€ ๊ฒ€์ฆ ๋ฐฉ์‹(DaoAuthenticationProvider)์— ์šฐ๋ฆฌ๊ฐ€ ๋งž์ถ”๊ธฐ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค. ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ์ž…์žฅ์—์„œ๋Š” ํ”„๋กœ์ ํŠธ๋งˆ๋‹ค์˜ ๋‹ค์–‘ํ•œ ๋กœ๊ทธ์ธ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด ์—”ํ‹ฐํ‹ฐ์˜ ์ •๋ณด๋ฅผ ๋ชจ๋‘ ์ปค๋ฒ„ํ•ด์•ผ ํ•˜๋Š”๋ฐ ์ด๋ฅผ ์œ„ํ•ด UserDetails๋ผ๋Š” ๊ป๋ฐ๊ธฐ๋ฅผ ๋งŒ๋“ค์–ด ๋‘๊ณ  ์—ฌ๊ธฐ์— ๋งž์ถฐ์„œ ๋„ˆํฌ์˜ User ์ •๋ณด๊ฐ€ ๋‹ด๊ธด ์—”ํ‹ฐํ‹ฐ์˜ ํ•„๋“œ ๊ฐ’์„ ์˜ฎ๊ธฐ๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ์ด์ฃ .
  • ์ €ํฌ๋Š” ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์žฌํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด UserDetails๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•จ๊ณผ ๋™์‹œ์— ๊ธฐ์กด์˜ Member ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ƒ์†๋ฐ›๋Š” MemberDetails๋ฅผ ๋งŒ๋“ค๊ฒ ์Šต๋‹ˆ๋‹ค.

 

MemberDetails

  • MemberDetails ํด๋ž˜์Šค๋Š” MemberDetails class์˜ ์ด๋„ˆ ํด๋ž˜์Šค๋กœ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ด์œ ๋Š” ํด๋ž˜์Šค ๊ฐ„์˜ ๋…ผ๋ฆฌ์  ๊ฒฐํ•ฉ ๋•Œ๋ฌธ์ธ๋ฐ์š”.
    • MemberDetails๋ผ๋Š” ํด๋ž˜์Šค๋Š” ์ง€๊ธˆ๋„ ๊ทธ๋ ‡์ง€๋งŒ ์•ž์œผ๋กœ๋„ ์‚ฌ์šฉํ•˜๋Š” ๊ณณ์ด MemberDetailsService์—์„œ ๋ฆฌํ„ดํ•  ๋•Œ๋ฟ์ž…๋‹ˆ๋‹ค.
    • MemberDetailsService ํด๋ž˜์Šค๊ฐ€ AuthenticationProvider์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊บผ๋‚ด ์˜จ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋„๋ก UserDetails ๊ตฌํ˜„์ฒด๋กœ ๋งŒ๋“ค์–ด ๋ฆฌํ„ดํ•˜๋Š” ๋กœ์ง ์ด์™ธ์— ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํด๋ž˜์Šค๋ฅผ ์™„์ „ํžˆ ๋‚˜๋ˆ„์–ด ๋งŒ๋“œ๋Š” ๊ฒƒ๋ณด๋‹ค ์ด๋„ˆํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์–ด ๊ฒฐํ•ฉํ•˜์—ฌ ๊ด€๋ฆฌ๋„ ์‰ฝ๊ณ  ์ง๊ด€์ ์œผ๋กœ ์‚ฌ์šฉ์ฒ˜๊ฐ€ ์ •ํ•ด์ ธ ์žˆ๋‹ค๋Š” ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • ๋˜ํ•œ, Member ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ƒ์†๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜์—ฌ Member ์—”ํ‹ฐํ‹ฐ์˜ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•จ๊ณผ ๋™์‹œ์— Member ์—”ํ‹ฐํ‹ฐ์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Œ์„ ๋“œ๋Ÿฌ๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • @Getter์™€ ๊ฐ™์€ Getter ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์–ด์•ผ PasswordEncoder์˜ matches ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์ •์ƒ์ ์œผ๋กœ UserDetails์˜ encoded password(MemberDetails์˜ password)๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ €๋Š” ์‰ฌ์šด ์ดํ•ด๋ฅผ ์œ„ํ•ด MemberDetails์˜ ํ•„๋“œ๋ฅผ Member ์—”ํ‹ฐํ‹ฐ์˜ ๋ชจ๋“  ํ•„๋“œ๋กœ ํ•˜์˜€์œผ๋‚˜, ํ•„์š”์— ๋”ฐ๋ผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด ๋ถ€๋ถ„์€ ๋ชจ๋“  ๋กœ์ง์„ ์ดํ•ดํ•˜๊ฒŒ ๋  ๋•Œ ๋‹ค์‹œ ๋ณด์‹œ๊ณ  ์ปค์Šคํ…€ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • @Override๊ฐ€ ๋ถ™์€ getAuthorities() ๋ฉ”์„œ๋“œ๋Š” UserDetails๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋กœ ๋งŒ์•ฝ Member ์—”ํ‹ฐํ‹ฐ์— grade ๋“ฑ์˜ ํšŒ์› ๋“ฑ๊ธ‰์— ๊ด€๋ จ๋œ ํ•„๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ํ™œ์šฉํ•˜์—ฌ ๊ถŒํ•œ ๋ณ„๋กœ ์ ‘๊ทผ์„ ์ œํ•œํ•˜๋Š” ๋กœ์ง์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋ฒˆ ์˜ˆ์ œ์—์„œ๋Š” ๊ทธ๋Ÿฐ ๋””ํ…Œ์ผํ•œ ๋ถ€๋ถ„์€ ์ œ์™ธํ•˜์˜€์œผ๋ฏ€๋กœ ํ•„์š”์‹œ ์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • log ๊ด€๋ จ ์ฝ”๋“œ๋Š” ๋ˆˆ์œผ๋กœ member ๊ฐ์ฒด๊ฐ€ ์ž˜ ๋ถˆ๋Ÿฌ์™€์ง€๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋„ฃ์€ ์ฝ”๋“œ์ด๋ฏ€๋กœ ์•ˆ ๋„ฃ์œผ์…”๋„ ๋ฌด๋ฐฉํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿ“ ์ž ๊น ์ •๋ฆฌ

  • ์ด์ œ DaoAuthenticationProvider๊ฐ€ MemberDetailsService์—๊ฒŒ ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ ์‹œ ์ž…๋ ฅํ•œ username(id)๋ฅผ ๊ฑด๋„ค์ค„ ํ…Œ๋‹ˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ํ•ด๋‹น ์œ ์ € ์ •๋ณด๋ฅผ ์ฐพ์•„ ๋‚ด๊ฐ€ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๊ฒŒ UserDetails์˜ ๊ตฌํ˜„์ฒด์— ์˜ฎ๊ธฐ๊ณ  ๋ฆฌํ„ดํ•˜๋ผ๊ณ  ๋ช…๋ นํ•˜๊ธฐ ์œ„ํ•œ ์ค€๋น„๊ฐ€ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค.
  • MemberDetailsService๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์€ username(id)๋ฅผ ๊ฐ€์ง€๊ณ  MemberRepository๋ฅผ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ฐพ์•„ UserDetails์˜ ๊ตฌํ˜„์ฒด์ธ MemberDetails๋กœ ๋ฆฌํ„ดํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์ด๋ฅผ ์ ์šฉํ•ด ๋ด…์‹œ๋‹ค.

 

SecurityConfig

  • ์œ„์—์„œ ๋งŒ๋“  MemberDetailsService๋ฅผ ์˜์กด์„ฑ ์ฃผ์ž…๋ฐ›์Šต๋‹ˆ๋‹ค.
  • authenticationProvider() ๋ฉ”์„œ๋“œ์— DaoAuthenticationProvider์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ , passeordEncoder์™€ memberDetailsService๋ฅผ ์ฃผ์ž…ํ•ด ์ค๋‹ˆ๋‹ค.
  • AuthenticationManager -> AuthenticationProvider -> UserDetailsService -> UserDetails ๋ฆฌํ„ด๊นŒ์ง€ ์ด์–ด์ง€๋Š” ๋กœ์ง์ด ์™„์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ‘€ DaoAuthenticationProvider ์‚ดํŽด๋ณด๊ธฐ

retrieveUser ๋ฉ”์„œ๋“œ

  • DaoAuthenticationProvider ํด๋ž˜์Šค์˜ retrieveUser ๋ฉ”์„œ๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด UserDetailsService์—์„œ loadUserByUsername ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฆฌํ„ด ๋ฐ›์€ UserDetails ๊ฐ์ฒด๋ฅผ  loadedUser์— ์‹ฃ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

additionalAuthenticationChecks ๋ฉ”์„œ๋“œ

  • AuthenticationManager๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ UsernamePasswordAuthenticationToken๊ณผ UserDetailsService์—๊ฒŒ ๋ฐ›์€ UserDetails์—์„œ ํŒจ์Šค์›Œ๋“œ๋ฅผ ๊บผ๋‚ด์–ด passwordEncoder์˜ matches ๋ฉ”์„œ๋“œ๋กœ ๋‘ ํŒจ์Šค์›Œ๋“œ์˜ ์ธ์ฝ”๋”ฉ ๊ฐ’์ด ๊ฐ™์€์ง€ ํ™•์ธํ•˜๋Š” ๋ฉ”์„œ๋“œ๋„ ๋ณด์ž…๋‹ˆ๋‹ค.

 

๐Ÿƒ๐Ÿป ๋‹ค์Œ์œผ๋กœ

  • ์ด์ œ ๋กœ๊ทธ์ธ ๊ฒ€์ฆ์— ๋Œ€ํ•œ ๊ตฌํ˜„์ด ๊ฑฐ์˜ ๋งˆ๋ฌด๋ฆฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๋กœ๊ทธ์ธ์ด ๊ฒ€์ฆ์ด ์„ฑ๊ณต์ ์œผ๋กœ ๋๋‚˜๋ฉด ๋ฌด์—‡์„ ํ•ด์•ผ ํ• ๊นŒ์š”?
  • ์ผ๋‹จ, ์‘๋‹ต๊ฐ’์„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ณด๋‚ด์•ผ๊ฒ ์ฃ . ๋ฐ˜๋Œ€๋กœ ์‹คํŒจํ–ˆ์„ ์‹œ์—๋„ ์‹คํŒจ์— ๋”ฐ๋ฅธ ์‘๋‹ต๊ฐ’์„ ๋ณด๋‚ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ๋˜ํ•œ, JWT ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•ด ์ค˜์•ผ๊ฒ ์ฃ ? ์ด๋•Œ Refresh Token์˜ ๊ฒฝ์šฐ์—๋Š” ์„œ๋ฒ„์— ์ €์žฅํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ์ €ํฌ๋Š” Redis๋ฅผ ํ™œ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์•„์ง ๊ฐˆ ๊ธธ์ด ๋ฉ‰๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ธ€์—์„œ๋Š” ์ด ๋ชจ๋“  ๊ฑธ ๊ตฌํ˜„ํ•˜๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ ธ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
728x90