Authentication

인증 μ •λ³΄λ‘œ μ‚¬μš©μžμ˜ 인증정보λ₯Ό μ €μž₯ν•˜λŠ” 토큰같은 κ°œλ…

μΈμ¦μ‹œ id/passwordλ₯Ό λ‹΄κ³  인증 검증을 μœ„ν•΄ 이λ₯Ό 전달/μ‚¬μš©ν•œλ‹€.

인증 ν›„μ—λŠ” μ΅œμ’… κ²°κ³Ό(인증 주체/객체/λΉ„λ°€λ²ˆν˜Έ/κΆŒν•œμ •λ³΄ λ“±)λ₯Ό λ‹΄κ³  SecurityContext에 μ €μž₯λ˜μ–΄ μ „μ—­μœΌλ‘œ μ°Έμ‘° κ°€λŠ₯ν•˜λ‹€.

ꡬ쑰

  1. principal : 인증 주체(idλ‚˜ User객체와 같이 μ‚¬μš©μžλ₯Ό 식별)

  2. credentials : λΉ„λ°€λ²ˆν˜Έ

  3. authorities : κΆŒν•œ, μ—­ν• 

  4. details : λΆ€κ°€ 정보

  5. Authenticated : 인증 μ—¬λΆ€(T/F)

κ³Όμ •

  1. Id/Pwλ₯Ό μ„œλ²„μ— 전달

  2. UsernamePasswordAuthenticationFilterμ—μ„œ 이λ₯Ό 필터링

  3. μš”μ²­ν•œ Id/PWλ₯Ό 담은 Authentication 객체 생성

  4. AuthenticationManagerμ—κ²Œ 이 인증 객체 전달(μˆ˜μ‹ )

  5. ManagerλŠ” μ ν•©ν•œ 인증객체 Providerμ—κ²Œ 인증객체 전달

  6. ProviderλŠ” μš”μ²­ 정보λ₯Ό μ΄μš©ν•΄ 인증과정 μˆ˜ν–‰

  7. 인증이 μ„±κ³΅ν•œλ‹€λ©΄ κΆŒν•œκ³Ό 인증 μ—¬λΆ€λ₯Ό μ…‹νŒ…ν•œ 인증객체λ₯Ό SecurityContext에 μ €μž₯

UsernamePasswordAuthenticationFilter

μ‚¬μš©μž 인증 μš”μ²­μ„ Authentication μΈν„°νŽ˜μ΄μŠ€λ‘œ μΆ”μƒν™”ν•˜κ³ , AuthenticationManagerλ₯Ό ν˜ΈμΆœν•œλ‹€.

Authentication

μ‹€μ œ μ‚¬μš©μž 인증 정보λ₯Ό μ˜λ―Έν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€

  • Principal : μ‚¬μš©μžλ₯Ό ꡬ뢄(μΌμ’…μ˜ id) -> μ ‘κ·Ό 주체

  • Credentials : μ ‘κ·Ό 주체의 λΉ„λ°€λ²ˆν˜Έ

  • Authorities : μ‚¬μš©μžμ˜ ROLE

getPricipal()(인증 아이디), getCredentials()(인증 λΉ„λ°€λ²ˆν˜Έ), getAuthorities()(μ‚¬μš©μž κΆŒν•œλͺ©λ‘), getDetails()(뢀가정보), isAuthenticated()(인증여뢀)와 같은 λ©”μ„œλ“œ 제곡

UsernamePasswordAuthenticationToken authentication= new UsernamePasswordAuthenticationToken(username, password);

AuthenticaitonManager

μ‚¬μš©μž 아이디/λΉ„λ°€λ²ˆν˜Έλ₯Ό μΈμ¦ν•˜κΈ° μœ„ν•΄ μ μ ˆν•œ AuthenticationProvider μ°Ύμ•„ 처리λ₯Ό μœ„μž„ν•œλ‹€. κ΅¬ν˜„κ°μ²΄λ‘œ ProviderManagerλ₯Ό μ œκ³΅ν•œλ‹€.

(κΈ°λ³Έ ProviderMansgerμ—μ„œ Form인증(DaoAuthenticationProvider)은 , RememberMe인증(RememberMeAuthenticationProvider)을 제곡 )

기본적으둜 μ œκ³΅ν•˜λŠ” Providerκ°€ μ—†λŠ” JWT, OAuth와 같은 λ³„λ„μ˜ 인증을 μΆ”κ°€ ν•˜κ³ μž ν•˜λ©΄ λΆ€λͺ¨ProviderManagerλ₯Ό νƒμƒ‰ν•΄μ„œ μ²˜λ¦¬ν•  수 μžˆλŠ” providerλ₯Ό μ°ΎλŠ”λ‹€.

spring λ³΄μ•ˆ 인증 ν”„λ‘œμ„ΈμŠ€μ˜ ν•΅μ‹¬μœΌλ‘œ 방법을 μ •μ˜ν•˜λŠ” api

public interface AuthenticationManager {
    Authentication authenticate(Authentication authentication) throwsAuthenticationException;
}

μ»€μŠ€ν…€ providerλ₯Ό λ§Œλ“€μ—ˆλ‹€λ©΄ 등둝해주어야 ν•œλ‹€

@Autowired
public void configureAuthentication(AuthenticationManagerBuilder builder, JwtAuthenticationProvider jwtAuthenticationProvider) {
    builder.authenticationProvider(jwtAuthenticationProvider);
}

AuthenticationProvider

μ‹€μ§ˆμ μœΌλ‘œ μ‚¬μš©μž 인증을 μ²˜λ¦¬ν•˜κ³ , 인증 κ²°κ³Όλ₯Ό Authentication μΈν„°νŽ˜μ΄μŠ€λ‘œ λ°˜ν™˜ν•œλ‹€.

μ»€μŠ€ν…€ providerλ₯Ό λ§Œλ“€κ³ μž ν•œλ‹€λ©΄ 이λ₯Ό implementsν•˜μ—¬ κ΅¬ν˜„

authenticate()μ—μ„œ μ‹€μ œ 인증을 μ²˜λ¦¬ν•˜κ³  supports()λŠ” AuthenticationManagerμ—μ„œ μš”μ²­μΈμ¦κ°μ²΄μ— 적합함 Providerλ₯Ό μ°ΎκΈ° μœ„ν•œ λ©”μ„œλ“œμ΄λ‹€.

public interface AuthenticationProvider {
    Authentication authenticate(Authentication authentication) throws AuthenticationException;
    boolean supports(Class<?> authentication);
}

UserDetails

μ‚¬μš©μžμ˜ 정보λ₯Ό λ‹΄λŠ” μΈν„°νŽ˜μ΄μŠ€λ‘œ VOμ—­ν• 

  • getAuthorities() : 계정이 κ°–κ³ μžˆλŠ” κΆŒν•œ λͺ©λ‘μ„ 리턴

  • getPassword() : κ³„μ •μ˜ λΉ„λ°€λ²ˆν˜Έλ₯Ό 리턴

  • getUsername() : κ³„μ •μ˜ 이름을 리턴

  • isAccountNonExpired() : 계정이 λ§Œλ£Œλ˜μ§€ μ•Šμ•˜λŠ” 지 리턴 (true: λ§Œλ£Œμ•ˆλ¨)

  • isAccountNonLocked() : 계정이 μž κ²¨μžˆμ§€ μ•Šμ•˜λŠ” 지 리턴 (true: μž κΈ°μ§€ μ•ŠμŒ)

  • isCredentialNonExpired() : λΉ„λ°€λ²ˆν˜Έκ°€ λ§Œλ£Œλ˜μ§€ μ•Šμ•˜λŠ” 지 리턴 (true: λ§Œλ£Œμ•ˆλ¨)

  • isEnabled() : 계정이 ν™œμ„±ν™”(μ‚¬μš©κ°€λŠ₯)인 지 리턴 (true: ν™œμ„±ν™”)

  • UserDetailsService : DAO둜 μ‚¬μš©λ˜λ©° μ‚¬μš©μž 정보λ₯Ό λ‘œλ“œν•˜κΈ° μœ„ν•œ μΈν„°νŽ˜μ΄μŠ€λ‘œ UserDetailsλ₯Ό λ°˜ν™˜ν•˜λŠ” ν•˜λ‚˜μ˜ λ©”μ„œλ“œλ₯Ό κ°–κ³ μžˆλ‹€.

Last updated