BE/Spring & Spring Boot

[Spring Boot] SpringSecurity UserDetails, User

baek-dev 2025. 1. 24. 18:52

Spring Security에서 UserDetails와 User

 

Spring Security는 애플리케이션의 인증(Authentication)과 권한(Authorization)을 관리하기 위해 설계된 프레임워크임.

UserDetailsUser는 사용자의 인증 정보를 처리하기 위해 사용되는 주요 인터페이스 및 클래스임.


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) 인증 및 권한 부여

AuthenticationManagerUserDetails 객체를 기반으로 사용자를 인증하고 권한을 부여함.


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