Spring Security에서 왜 Member 대신 UserDetails를 사용하나?

2026. 5. 12. 16:44·코드잇 스프린트/Spring 이론

Spring Security를 처음 학습할때 가장 헷갈렸던 부분 중 하나는 다음이었다.

"DB에는 Member 엔티티가 있는데, 왜 Spring Security는 갑자기 UserDetails를 사용하지?"

 

실제로 사용자 정보는 Member 엔티티에 저장되어 있는데, 인증과정에서는 UserDetails라는 객체가 등장한다.

 

이번 글에서 Spring Security 인증 구조에서 UserDetails가 왜 필요한지,

그리고 Member 엔티티와 어떤 역할 차이가 있는지 정리해보려고 한다.

 


결론

Member는 비즈니스 도메인 엔티티이고,

UserDetails는 Spring Security가 사용하는 로그인 사용자 표준 객체이다.


Spring Security 인증 흐름

로그인 요청
    ↓
AuthenticationProvider
    ↓
UserDetailsService
    ↓
DB에서 Member 조회
    ↓
UserDetails 객체 반환
    ↓
Spring Security 인증 처리
  • DB에서는 Member를 조회하지만, Spring Security 내부에서는 UserDetails를 사용한다.
@Component
public class HelloUserDetailsServiceV3 implements UserDetailsService {
    private final MemberRepository memberRepository;
    private final HelloAuthorityUtils authorityUtils;

    public HelloUserDetailsServiceV3(MemberRepository memberRepository, HelloAuthorityUtils authorityUtils){
        this.memberRepository = memberRepository;
        this.authorityUtils = authorityUtils;
    }
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        // 회원조회
        // (6)credential 조회
        // (7)UserDetails 생성
        Member findMember = memberRepository.findByEmail(username)
                .orElseThrow(() -> new BusinessLogicException(ExceptionCode.MEMBER_NOT_FOUND));

//        // 내부적으로 List, Set 사용
//        // ? extend GrantedAuthority: GrantedAuthority를 상속받고있는 애들만 들어올 수 있다.
//        Collection<? extends GrantedAuthority> authorities =
//                authorityUtils.createAuthorities(findMember.getEmail());

        // (8)UserDetails 전달
        return new HelloUserDetails(findMember);
    }

    // UserDetails 정보가 너무 빈약하기때문에 Member의 필드를 참조하고 싶은것.
    private final class HelloUserDetails extends Member implements UserDetails{

        public HelloUserDetails(Member member){
            setMemberId(member.getMemberId());
            setEmail(member.getEmail());
            setPassword(member.getPassword());
            setFullName(member.getFullName());

            //권한 추가
            setRoles(member.getRoles());
        }

        @Override
        public Collection<? extends GrantedAuthority> getAuthorities() {
            return authorityUtils.createAuthorities(this.getRoles());
        }

        @Override
        public String getUsername() {
            return this.getEmail();
        }

        @Override
        public boolean isAccountNonExpired() {
            return true;
        }

        @Override
        public boolean isAccountNonLocked() {
            return true;
        }

        @Override
        public boolean isCredentialsNonExpired() {
            return true;
        }

        @Override
        public boolean isEnabled() {
            return true;
        }
    }
}
  • UserDetailsService를 보면 loadUserByUsername() 메서드를 통해 DB에 Member를 조회하고 반환은 UserDetails로 하는걸 알 수 있다.

 

왜 Member를 직접 사용하지 않을까?

Spring Security는 특정 프로젝트 엔티티 구조를 알지 못한다.

프로젝트 마다 Member, User, Admin등 사용자 엔티티 이름과 구조가 모두 다르다.

그래서 Spring Security는 "프로젝트마다 다른 사용자 엔티티 대신 내가 필요한 사용자 정보 형식을 정의하자" 라는 방식으로 설계

 

즉 "추상화"를 위해서 라고 생각하면 됨.

-> Spring Security는 프로젝트마다 다른 사용자 엔티티가 Member이든, User이든, Admin이든 알 필요가 없다.


 

정리

Spring Security에서 UserDetails를 사용하는 이유는 프로젝트마다 다른 사용자 엔티티 구조를 통일된 방식으로 처리하기 위해서이다.

'코드잇 스프린트 > Spring 이론' 카테고리의 다른 글

애플리케이션의 각 계층에서 수행되는 입력값 검증의 범위와 책임  (0) 2026.04.06
트랜잭션 ACID중 격리성(Isolation)이 보장되지 않을때 문제  (0) 2026.04.01
JPA에서 발생하는 N+1 문제의 발생 원인과 해결 방안(EAGER 는 JOIN이 아니다.)  (1) 2026.03.26
웹 API가 SOAP에서 REST로 전환된 이유  (0) 2026.02.27
Spring Bean이란?  (2) 2026.01.26
'코드잇 스프린트/Spring 이론' 카테고리의 다른 글
  • 애플리케이션의 각 계층에서 수행되는 입력값 검증의 범위와 책임
  • 트랜잭션 ACID중 격리성(Isolation)이 보장되지 않을때 문제
  • JPA에서 발생하는 N+1 문제의 발생 원인과 해결 방안(EAGER 는 JOIN이 아니다.)
  • 웹 API가 SOAP에서 REST로 전환된 이유
과컴
과컴
벡엔드 개발자 최소기준 맞추겠습니다.
  • 과컴
    곽의 프로그램
    과컴
  • 전체
    오늘
    어제
    • 분류 전체보기 (76)
      • 위클리페이퍼 (6)
      • 파이썬 (4)
      • 코드잇 스프린트 (48)
        • Spring 이론 (7)
        • Java이론 (11)
        • 실습 (23)
      • 백엔드 개발자 최소기준 (1)
      • 코딩테스트 (5)
        • 알고리즘 (0)
        • SQL (1)
      • Git (5)
      • 스프링부트 핵심가이드 (1)
      • 트러블 슈팅 (2)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    문자열
    백준1152
    백준2576
    파이썬기초
    파이썬
    백준1075번
    백준브론즈
    파이썬입문
    혼공파
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
과컴
Spring Security에서 왜 Member 대신 UserDetails를 사용하나?
상단으로

티스토리툴바