
UserDetails 인터페이스는 사용자 인증 정보와 관련된 핵심 정보를 제공하는 역할을 합니다.
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import java.util.Collection;
public class CustomUserDetails implements UserDetails {
private String username;
private String password;
private boolean isEnabled;
private boolean isAccountNonExpired;
private boolean isAccountNonLocked;
private boolean isCredentialsNonExpired;
private Collection<? extends GrantedAuthority> authorities;
public CustomUserDetails(String username, String password, Collection<? extends GrantedAuthority> authorities) {
this.username = username;
this.password = password;
this.isEnabled = true;
this.isAccountNonExpired = true;
this.isAccountNonLocked = true;
this.isCredentialsNonExpired = true;
this.authorities = authorities;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return authorities;
}
@Override
public String getPassword() {
return password;
}
@Override
public String getUsername() {
return username;
}
@Override
public boolean isAccountNonExpired() {
return isAccountNonExpired;
}
@Override
public boolean isAccountNonLocked() {
return isAccountNonLocked;
}
@Override
public boolean isCredentialsNonExpired() {
return isCredentialsNonExpired;
}
@Override
public boolean isEnabled() {
return isEnabled;
}
}
주요 메서드
- getAuthorities()
- 설명: 사용자가 가지고 있는 권한을 반환합니다. 이 권한은 인증 및 인가 과정에서 사용됩니다.
- 반환 타입: Collection<? extends GrantedAuthority>
- 반환 값: 권한의 컬렉션(비어있거나 null이 될 수 없습니다).
- getPassword()
- 설명: 사용자의 비밀번호를 반환합니다. 인증 과정에서 입력된 비밀번호와 비교됩니다.
- 반환 타입: String
- 반환 값: 사용자 비밀번호.
- getUsername()
- 설명: 사용자의 이름을 반환합니다. 인증 과정에서 사용됩니다.
- 반환 타입: String
- 반환 값: 사용자 이름(비어있거나 null이 될 수 없습니다).
- isAccountNonExpired()
- 설명: 사용자의 계정이 만료되지 않았는지 여부를 반환합니다. 만료된 계정은 인증될 수 없습니다.
- 반환 타입: boolean
- 반환 값: 계정이 만료되지 않았으면 true, 만료되었으면 false.
- isAccountNonLocked()
- 설명: 사용자의 계정이 잠겨 있지 않은지 여부를 반환합니다. 잠긴 계정은 인증될 수 없습니다.
- 반환 타입: boolean
- 반환 값: 계정이 잠겨 있지 않으면 true, 잠겨 있으면 false.
- isCredentialsNonExpired()
- 설명: 사용자의 자격 증명(비밀번호)이 만료되지 않았는지 여부를 반환합니다. 만료된 자격 증명은 인증될 수 없습니다.
- 반환 타입: boolean
- 반환 값: 자격 증명이 만료되지 않았으면 true, 만료되었으면 false.
- isEnabled()
- 설명: 사용자가 활성화되어 있는지 여부를 반환합니다. 비활성화된 사용자는 인증될 수 없습니다.
- 반환 타입: boolean
- 반환 값: 사용자가 활성화되어 있으면 true, 비활성화되어 있으면 false.
왜 setter가 없는가?
UserDetails 인터페이스에 setter 메서드가 없는 이유는 다음과 같습니다:
- 불변성 (Immutability):
- UserDetails 객체는 인증 과정에서 한 번 생성된 후 변경되지 않아야 합니다. 이를 통해 인증 과정에서 데이터가 변하지 않도록 보장합니다.
- 불변성은 객체의 상태를 안전하게 유지하고, 동시성 문제를 방지하는 데 도움이 됩니다.
- 보안 (Security):
- 사용자 정보를 포함하는 객체가 인증 중간에 수정될 수 있다면, 보안상의 문제가 발생할 수 있습니다. 예를 들어, 악의적인 코드가 인증 과정 중간에 사용자 정보를 변경할 수 있습니다.
- setter 메서드를 허용하지 않음으로써, 이러한 잠재적인 보안 문제를 방지합니다.
- 계약 (Contract) 준수:
- 인터페이스는 사용자 정보에 대한 특정 계약을 정의합니다. 이러한 계약은 getter 메서드로만 접근 가능하도록 하여, UserDetails 객체의 상태가 외부에서 변경되지 않도록 보장합니다.
- 예를 들어, 특정 조건 하에만 계정이 활성화되는 등의 규칙을 유지할 수 있습니다.

Spring Security에서 사용자 정보를 저장하고 인증을 처리하는 두 가지 주요 방식, 즉 Authentication과 UserDetails이 있다.
다이어그램의 주요 구성 요소
왼쪽: Authentication 인터페이스와 UsernamePasswordAuthenticationToken 클래스
- Principal (Interface)
- 사용자에 대한 정보를 나타내는 인터페이스입니다.
- Authentication (Interface)
- 인증을 나타내는 인터페이스로, 인증 상태와 인증된 사용자 정보(Principal), 자격 증명(Credentials)을 제공합니다.
- 주요 메서드:
- getName(): 사용자 이름을 반환합니다.
- getPrincipal(): 주체(Principal) 객체를 반환합니다.
- getAuthorities(): 사용자의 권한을 반환합니다.
- getCredentials(): 자격 증명을 반환합니다.
- getDetails(): 추가 세부 정보를 반환합니다.
- isAuthenticated(): 인증 여부를 반환합니다.
- setAuthenticated(boolean isAuthenticated): 인증 상태를 설정합니다.
- eraseCredentials(): 자격 증명을 지웁니다.
- UsernamePasswordAuthenticationToken (Class)
- Authentication 인터페이스의 구현체로, 사용자 이름과 비밀번호 기반 인증을 처리합니다.
오른쪽: UserDetails 인터페이스와 User 클래스
- UserDetails (Interface)
- 사용자의 핵심 정보를 제공하는 인터페이스입니다.
- 주요 메서드:
- getPassword(): 비밀번호를 반환합니다.
- getUsername(): 사용자 이름을 반환합니다.
- getAuthorities(): 사용자의 권한을 반환합니다.
- isAccountNonExpired(): 계정이 만료되지 않았는지 여부를 반환합니다.
- isAccountNonLocked(): 계정이 잠겨 있지 않은지 여부를 반환합니다.
- isCredentialsNonExpired(): 자격 증명이 만료되지 않았는지 여부를 반환합니다.
- isEnabled(): 계정이 활성화되었는지 여부를 반환합니다.
- eraseCredentials(): 자격 증명을 지웁니다.
- User (Class)
- UserDetails 인터페이스의 기본 구현체로, 사용자 정보를 저장하고 제공합니다.
왜 두 가지 방식이 존재하는가?
- Authentication
- 설명: 인증 요청과 인증 상태를 처리하는 데 사용됩니다. 주로 인증 프로세스 동안 AuthenticationManager와 AuthenticationProvider 내에서 사용됩니다.
- 역할: 인증이 성공했는지 여부를 판단하는 데 사용됩니다.
- 사용처: 인증 프로세스에서 반환 타입으로 사용됩니다.
- UserDetails
- 설명: 저장 시스템에서 사용자 정보를 로드하는 데 사용됩니다. 주로 UserDetailsService와 UserDetailsManager 내에서 사용됩니다.
- 역할: 사용자 정보를 제공하여 인증 과정을 지원합니다.
- 사용처: 사용자 정보를 로드할 때 반환 타입으로 사용됩니다.
요약
- Authentication: 인증 요청과 인증 상태를 나타냅니다. 주로 인증 프로세스에서 사용됩니다.
- UserDetails: 사용자 정보를 나타내며, 저장 시스템에서 사용자 정보를 로드할 때 사용됩니다.