๐ ์ด๋ฒ ๊ธ์์๋ 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
- 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 ๊ณต์ ๋ฌธ์
- ๋ด์ฉ์ ์์ฝํด ๋ณด๋ฉด ์ด๋ ์ต๋๋ค.
- 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๋ฅผ ํ์ฉํ ๊ฒ์ ๋๋ค.
- ์์ง ๊ฐ ๊ธธ์ด ๋ฉ๋๋ค. ๋ค์ ๊ธ์์๋ ์ด ๋ชจ๋ ๊ฑธ ๊ตฌํํ๋ ์๊ฐ์ ๊ฐ์ ธ๋ณด๊ฒ ์ต๋๋ค.