UserDetails 란?
Spring Security에서 사용자의 정보를 담는 인터페이스이다. Spring Security에서 사용자의 정보를 불러오기 위해서 구현해야 하는 인터페이스로, 오버라이드 메소드들은 아래와 같다.
메소드 | return | 설명 | 기본값 |
getAutorities() | Collection<? extends GrantedAuthority> | 계정의 권한 목록을 리턴 | - |
getPassword() | String | 계정의 비밀번호를 리턴 | - |
getUsername() | String | 계정의 고유한 값을 리턴 (DB PK 값, 중복이 없는 email) | - |
isAccountNonExpired() | boolean | 계정의 만료 여부 리턴 | true (만료 안됨) |
isAccountNonLocked() | boolean | 계정의 잠김 여부 리턴 | true (잠기지 않음) |
isCredentialsNonExpired() | boolean | 비밀번호 만료 여부 리턴 | true (만료 안됨) |
isEnabled() | boolean | 계정의 활성화 여부 리턴 | true (활성화 됨) |
위 메소드들 중 중요한 메소드가 getUsername()이다. username은 계정의 고유한 값인데, 해당 username에 email(로그인용 아이디)을 넘겨준다면, SSO 같은 서버에서 정책에 따라 중복이 될 수 있기에, DB에서 User Table의 PK값을 넘겨주는 것도 좋은 방법이다.
현재는 SSO 방식으로 개발하지 않을 것이기에 아래 사이트에서 참고용으로 읽어보는것이 좋을것같다.
* SSO (https://aws.amazon.com/ko/what-is/sso/)
SSO란 무엇입니까? - Single Sign-On - AWS
예. SSO는 고급 ID 액세스 관리 솔루션입니다. 단일 로그온 솔루션을 구축하면 엔터프라이즈 애플리케이션 및 리소스에 대한 사용자 액세스 관리를 수행할 수 있습니다. SSO 솔루션을 사용하면 애
aws.amazon.com
CustomUserDetails
대부분의 경우 Spring Security의 기본 UserDetails로 실제 개발에 사용할 사용자 정보를 모두 담을 수 없기에 CustomUserDetails 클래스를 생성해 UserDetails를 구현하여 사용하는 방식을 선호한다.
해당 방식으로 코드를 짜면, 개발자의 입맛에 따라 추가하고 싶은 정보를 추가하여 넘겨줄 수 있다. 아래는 예시이다.
@Getter
public class CustomUserDetails implements UserDetails, Serializable {
private static final long serialVersionUID = 174726374856727L;
private String email; //이메일 - id
private String loginId; // 로그인용 ID 값
private String password; // 비밀번호
private boolean emailVerified; //이메일 인증 여부
private boolean locked; //계정 잠김 여부
private String nickname; //닉네임 - custom
private Collection<GrantedAuthority> authorities; //권한 목록
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return authorities;
}
@Override
public String getPassword() {
return password;
}
@Override
public String getUsername() {
return email;
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return locked;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
//이메일이 인증되어 있고 계정이 잠겨있지 않으면 true
return (emailVerified && !locked);
}
}
UserDetailsService 란?
Spring Security에서 유저의 정보를 가져오는 인터페이스이다. Spring Security에서 유저의 정보를 불러오기 위해서 구현해야하는 인터페이스로 기본 오버라이드 메소드는 다음과 같다.
메소드 | return | 설명 |
loadUserByUsername | UserDetails | 유저의 정보를 불러와서 UserDetails로 리턴 |
또한 User 이름으로 기본으로 제공되는 클래스들이 존재하므로, 해당 엔티티와 헷갈리지 않도록 Member로 구분지어 엔티티 설정해주는 것도 좋은 방법이 될 수 있다. 아래는 UserDetailsServiceImpl을 구현한 예시이다.
@Service
@RequiredArgsConstructor
public class UserDetailsServiceImpl implements UserDetailsService {
private final MemberRepository memberRepository;
@Override
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
Member member = memberRepository.findById(email).orElseThrow(() -> new UsernameNotFoundException("not found loginId : " + loginId));
CustomUserDetails customUserDetails = new CustomUserDetails();
// 값 세팅 로직 시작
...
// 값 세팅 로직 끝
return customUserDetails;
}
}
참고:
https://docs.spring.io/spring-security/site/docs/current/api/org/springframework/security/core/userdetails/UserDetailsService.html
https://programmer93.tistory.com/68