Spring Security에서 UserDetails와 User
Spring Security는 애플리케이션의 인증(Authentication)과 권한(Authorization)을 관리하기 위해 설계된 프레임워크임.
UserDetails와 User는 사용자의 인증 정보를 처리하기 위해 사용되는 주요 인터페이스 및 클래스임.
1. UserDetails
개념
UserDetails는 Spring Security에서 사용자 정보를 캡슐화한 인터페이스임.
• 사용자의 계정 정보(이름, 비밀번호, 권한 등)와 계정 상태(활성화 여부, 잠김 여부 등)를 정의함.
• UserDetails를 구현하여 사용자 정보를 커스터마이징할 수 있음.
주요 메서드
UserDetails는 다음과 같은 메서드를 제공함:
1. getAuthorities()
• 사용자의 권한(Role) 목록을 반환함.
2. getPassword()
• 사용자의 암호화된 비밀번호를 반환함.
3. getUsername()
• 사용자의 고유 식별자(주로 사용자 이름)를 반환함.
4. isAccountNonExpired()
• 계정의 만료 여부를 반환함.
5. isAccountNonLocked()
• 계정의 잠김 여부를 반환함.
6. isCredentialsNonExpired()
• 인증 정보(비밀번호 등)의 만료 여부를 반환함.
7. isEnabled()
• 계정의 활성화 여부를 반환함.
사용 예시
public class CustomUserDetails implements UserDetails {
private final User user; // 사용자 엔티티 클래스
public CustomUserDetails(User user) {
this.user = user;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return user.getRoles().stream()
.map(role -> new SimpleGrantedAuthority(role.getName()))
.collect(Collectors.toList());
}
@Override
public String getPassword() {
return user.getPassword();
}
@Override
public String getUsername() {
return user.getUsername();
}
@Override
public boolean isAccountNonExpired() {
return true; // 만료 여부를 커스터마이징 가능
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return user.isEnabled();
}
}
2. User
개념
Spring Security에서 제공하는 User 클래스는 UserDetails 인터페이스의 기본 구현체임.
• 기본적으로 사용자가 UserDetails를 구현하지 않고도 사용자 정보를 관리할 수 있도록 도와줌.
• 비밀번호, 사용자 이름, 권한, 계정 상태 등을 관리할 수 있는 필드를 제공함.
주요 메서드
User 클래스는 UserDetails의 메서드를 구현하며, 다음과 같은 정적 메서드로 객체를 생성할 수 있음.
객체 생성
1. withUsername(String username)
• 사용자 이름을 설정하고 UserBuilder 객체를 반환함.
2. password(String password)
• 사용자 비밀번호를 설정함.
3. roles(String... roles)
• 사용자 역할을 설정함.
4. build()
• UserDetails 객체를 반환함.
사용 예시
UserDetails user = User.builder()
.username("john")
.password("{noop}password") // {noop}은 비밀번호 암호화 미사용
.roles("USER", "ADMIN")
.build();
3. UserDetails와 User의 관계
특징 | UserDetails | User |
역할 | 사용자 정보를 정의하기 위한 인터페이스 | UserDetails 인터페이스를 기본 구현한 클래스 |
구현 필요 여부 | 직접 구현해야 함 | Spring Security에서 제공하므로, 필요 시 바로 사용 가능 |
유연성 | 사용자 정의 요구사항에 맞게 자유롭게 설계 가능 | 기본 제공 기능으로 제한된 동작을 수행 |
4. 인증 흐름에서의 역할
1) 사용자 정보 제공
• UserDetailsService 인터페이스를 구현하여 UserDetails 객체를 반환함.
• Spring Security는 UserDetailsService에서 반환된 UserDetails 객체를 통해 사용자 정보를 활용함.
2) 인증 및 권한 부여
• AuthenticationManager가 UserDetails 객체를 기반으로 사용자를 인증하고 권한을 부여함.
5. 요약
• UserDetails: 사용자 정보를 정의하는 인터페이스. 직접 구현하여 커스터마이징 가능.
• User: Spring Security에서 제공하는 UserDetails 기본 구현체로, 바로 사용 가능.
• 사용자가 정의된 정보를 제공하려면 UserDetailsService를 구현해야 함.
Principal principal 과 @AuthenticationPrincipal UserDetails user 의 차이
-> principal 은 시큐리티에서 제공하는 기본 인터페이스, 인증된 사용자 정보를 포함. username만 제공한다.
어노테이션은 시큐리티의 UserDetails객체를 직접 주입받는 방법
username뿐만 아니라 사용자권한, 계정 상태 등 추가적인 사용자 정보를 포함.
단순 아이디만 필요할땐 principal, 추가정보까지 필요할땐 어노테이션
출처 : ChatGPT
'BE > Spring & Spring Boot' 카테고리의 다른 글
[Spring Boot] @Scheduled (0) | 2025.02.05 |
---|---|
[Spring Boot] SpringDoc (0) | 2025.01.28 |
[Spring Boot] OSIV (0) | 2025.01.23 |
[Spring Boot] Swagger와 OpenAPI (0) | 2025.01.22 |
[Spring Boot] MockMvc (0) | 2025.01.20 |