Spring Security를 이용한 인증/인가

오젼·2024년 7월 13일
0

Spring Security User 객체

Spring Security의 기능을 사용하기 위해 User 엔티티를 기반으로 Spring Security의 User 객체(UserDetails 구현체)를 만들었다.

ex) User 엔티티:

@Entity
@Table(name = "users")
public class User {
    @Id
    private String studentId;
    private String password;
    // ...
}

ex) Spring Security의 User 객체 (UserDetails 구현체):

return org.springframework.security.core.userdetails.User
        .withUsername(user.getStudentId())
        .password(user.getPassword())
        .authorities("ROLE_USER")
        // ...
        .build();

이 객체는 Spring Security의 내부 사용을 위한 특별한 형태의 객체이다.
Spring Security의 인증 및 권한 부여 메커니즘에서 사용된다.

User 엔티티의 핵심 정보(username, password)를 포함하고 있지만, Spring Security에 필요한 추가 정보(authorities, account status 등)도 함께 가지고 있다.

이 과정은 프로젝트의 도메인 모델(User 엔티티)을 Spring Security의 인증 모델(UserDetails)로 변환하는 과정이라고 볼 수 있다.

이렇게 함으로써 User 엔티티 구조와 Spring Security의 요구사항을 분리하여 관리할 수 있게 된다.

Spring Security User 객체가 사용되는 방법

  1. 인증 과정:

    • 사용자가 로그인을 시도하면, Spring Security의 AuthenticationManager가 인증 프로세스를 시작.
    • AuthenticationManager는 UserDetailsService를 호출하여 사용자 정보를 로드한다.
    • 따로 구현했던 CustomUserDetailsService의 loadUserByUsername 메소드가 호출되어 User 객체를 반환한다.
  2. 비밀번호 검증:

    • 반환된 User 객체의 비밀번호가 사용자가 입력한 비밀번호와 일치하는지 확인한다.
    • 이 과정에서 PasswordEncoder가 사용되어 암호화된 비밀번호를 비교한다.
  3. 인증 객체 생성:

    • 인증이 성공하면, 인증된 사용자 정보를 담은 Authentication 객체가 생성된다.
    • 이 객체는 SecurityContext에 저장되어 애플리케이션 전반에서 사용할 수 있게 된다.
  4. 권한 검사:

    • User 객체에 설정된 authorities (예: "ROLE_USER")는 애플리케이션의 다양한 부분에서 접근 제어를 위해 사용된다.
    • 예를 들어, @PreAuthorize 어노테이션이나 SecurityConfig에서 이 권한을 기반으로 특정 리소스에 대한 접근을 제어할 수 있다.
  5. 세션 관리:

    • 사용자의 세션이 유지되는 동안, 이 User 객체의 정보가 세션에 저장되어 지속적으로 사용된다.
  6. 현재 사용자 정보 접근:

    • 컨트롤러나 서비스 레이어에서 SecurityContextHolder를 통해 현재 인증된 사용자의 정보에 접근할 수 있다.
    Authentication auth = SecurityContextHolder.getContext().getAuthentication();
    UserDetails userDetails = (UserDetails) auth.getPrincipal();
  7. 로그아웃:

    • 사용자가 로그아웃하면, SecurityContext가 클리어되고 관련 세션 정보가 제거된다.
  8. 권한 기반 메소드 보안:

    • @Secured, @PreAuthorize 등의 어노테이션을 사용하여 메소드 레벨에서 권한 기반의 접근 제어를 구현할 때 이 User 객체의 권한 정보가 된다.
  9. Remember-Me 기능:

    • "Remember Me" 기능을 사용할 경우, 이 User 객체의 정보를 바탕으로 토큰이 생성되고 관리된다.
  10. OAuth2/JWT와의 통합:

    • OAuth2나 JWT를 사용하는 경우, 이 User 객체의 정보를 기반으로 토큰이 생성되거나 검증된다.

이 객체는 Spring Security의 핵심 컴포넌트들과 긴밀하게 연동되어 작동하며, 애플리케이션의 전반적인 보안 아키텍처의 기반이 된다.

추가 자료

https://www.elancer.co.kr/blog/view?seq=235

0개의 댓글