[스프링(spring)]시큐리티는 어떻게 동작할까??(2/6) UserDetails 인터페이스

allnight5·2023년 1월 4일
0

스프링

목록 보기
23/62

참조사이트 1
참조사이트 2

UserDetails 란?

  • Spring Security에서 사용자의 정보를 담는 인터페이스이다.
  • Spring Security가 개발자 대신에 내부적으로 사용자 정보를 알 수 있도록 UserDetails 인터페이스를 상속받아서 스프링 시큐리티가 필요한 정보들을 구현해야한다.

Spring Security에서 사용자의 정보를 불러오기 위해서 구현해야 하는 인터페이스로 기본 오버라이드 메서드들은 아래와 같다.

대부분의 경우 Spring Security의 기본 UserDetails로는 실무에서 필요한 정보를 모두 담을 수 없기에 CustomUserDetails와 같이 새로운 클래스를 구현하여 사용한다.

UserDetailsService 란?

Spring Security에서 유저의 정보를 가져오는 인터페이스이다.

자세한 내용

  • 사용자가 로그인을 할 때 기본 회원인지 인증하고, 인증이 완료되면 로그인한 상태의 사용자의 세션을 유지시켜주기 위한 인터페이스이다.
  • 기본적으로 해당 인터페이스를 상속받으면 loadUserByUsername 메서드를 구현해야 한다.
  • loadUserByUsername 메서드는 현재 시큐리티를 통해서 로그인한 회원이 기본 회원인지 아닌지 인증하는 메서드이다. 파라미터로 넘어온 username은 html form에서는 id 값에 해당하는 정보이고, JSON 데이터에서는 username에 해당하는 value 값이 넘어온다.
  • 인증에 성공하면 해당 회원에 대한 세션정보가 생성되고 Authentication 객체나 @AuthenticationPrincipal 애노테이션을 통해서 세션에 들어있는 사용자 정보를 꺼내와 사용할 수 있다. 즉, 이 메서드가 정상적으로 완료되어 UserDetails 정보가 반환되면 인증에 성공한 것이다.

Spring Security에서 유저의 정보를 불러오기 위해서 구현해야하는 인터페이스로 기본 오버라이드 메서드는 아래와 같다.

구현한 PrincipalDetailsService는 시큐리티 설정정보 클래스에 등록해야 정상적으로 사용할 수 있다

SecurityContextHolder에서 UserDetails 불러오기

Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
UserDetails userDetails = (UserDetails)principal;
String username = userDetails.getUsername();
String password = userDetails.getPassword();

기본적으로 Spring Security의 principal 객체는 Object 형태로 UserDetails를 형변환 해야 한다.

profile
공부기록하기

0개의 댓글