본문 바로가기

카테고리 없음

[Spring Boot] Security6 Userdetails

 

 

 

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;
    }
}

 

주요 메서드

  1. getAuthorities()
    • 설명: 사용자가 가지고 있는 권한을 반환합니다. 이 권한은 인증 및 인가 과정에서 사용됩니다.
    • 반환 타입: Collection<? extends GrantedAuthority>
    • 반환 값: 권한의 컬렉션(비어있거나 null이 될 수 없습니다).
  2. getPassword()
    • 설명: 사용자의 비밀번호를 반환합니다. 인증 과정에서 입력된 비밀번호와 비교됩니다.
    • 반환 타입: String
    • 반환 값: 사용자 비밀번호.
  3. getUsername()
    • 설명: 사용자의 이름을 반환합니다. 인증 과정에서 사용됩니다.
    • 반환 타입: String
    • 반환 값: 사용자 이름(비어있거나 null이 될 수 없습니다).
  4. isAccountNonExpired()
    • 설명: 사용자의 계정이 만료되지 않았는지 여부를 반환합니다. 만료된 계정은 인증될 수 없습니다.
    • 반환 타입: boolean
    • 반환 값: 계정이 만료되지 않았으면 true, 만료되었으면 false.
  5. isAccountNonLocked()
    • 설명: 사용자의 계정이 잠겨 있지 않은지 여부를 반환합니다. 잠긴 계정은 인증될 수 없습니다.
    • 반환 타입: boolean
    • 반환 값: 계정이 잠겨 있지 않으면 true, 잠겨 있으면 false.
  6. isCredentialsNonExpired()
    • 설명: 사용자의 자격 증명(비밀번호)이 만료되지 않았는지 여부를 반환합니다. 만료된 자격 증명은 인증될 수 없습니다.
    • 반환 타입: boolean
    • 반환 값: 자격 증명이 만료되지 않았으면 true, 만료되었으면 false.
  7. isEnabled()
    • 설명: 사용자가 활성화되어 있는지 여부를 반환합니다. 비활성화된 사용자는 인증될 수 없습니다.
    • 반환 타입: boolean
    • 반환 값: 사용자가 활성화되어 있으면 true, 비활성화되어 있으면 false.

왜 setter가 없는가?

UserDetails 인터페이스에 setter 메서드가 없는 이유는 다음과 같습니다:

  1. 불변성 (Immutability):
    • UserDetails 객체는 인증 과정에서 한 번 생성된 후 변경되지 않아야 합니다. 이를 통해 인증 과정에서 데이터가 변하지 않도록 보장합니다.
    • 불변성은 객체의 상태를 안전하게 유지하고, 동시성 문제를 방지하는 데 도움이 됩니다.
  2. 보안 (Security):
    • 사용자 정보를 포함하는 객체가 인증 중간에 수정될 수 있다면, 보안상의 문제가 발생할 수 있습니다. 예를 들어, 악의적인 코드가 인증 과정 중간에 사용자 정보를 변경할 수 있습니다.
    • setter 메서드를 허용하지 않음으로써, 이러한 잠재적인 보안 문제를 방지합니다.
  3. 계약 (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 인터페이스의 기본 구현체로, 사용자 정보를 저장하고 제공합니다.

왜 두 가지 방식이 존재하는가?

  1. Authentication
    • 설명: 인증 요청과 인증 상태를 처리하는 데 사용됩니다. 주로 인증 프로세스 동안 AuthenticationManager와 AuthenticationProvider 내에서 사용됩니다.
    • 역할: 인증이 성공했는지 여부를 판단하는 데 사용됩니다.
    • 사용처: 인증 프로세스에서 반환 타입으로 사용됩니다.
  2. UserDetails
    • 설명: 저장 시스템에서 사용자 정보를 로드하는 데 사용됩니다. 주로 UserDetailsService와 UserDetailsManager 내에서 사용됩니다.
    • 역할: 사용자 정보를 제공하여 인증 과정을 지원합니다.
    • 사용처: 사용자 정보를 로드할 때 반환 타입으로 사용됩니다.

요약

  • Authentication: 인증 요청과 인증 상태를 나타냅니다. 주로 인증 프로세스에서 사용됩니다.
  • UserDetails: 사용자 정보를 나타내며, 저장 시스템에서 사용자 정보를 로드할 때 사용됩니다.