[Spring] Spring Security - 주요 기능과 처리 과정 살펴보기

·2024년 1월 31일
1

Spring

목록 보기
1/6
post-thumbnail

Spring Security

Spring SecuritySpring 프레임워크에 대하여 인증, 권한 부여 등의 기능을 제공한다.

특징

Spring 내에서 Filter 를 기반으로 동작한다. 즉, Http RequestDispatcher Servlet 에 도착하기 이전, Spring Security 가 제공하는 기능을 활용하여, 인증 혹은 인가에 대한 사전 검증을 진행한다.

Spring Security의 주요 기능

UserDetails

Spring Security 에서 사용자의 정보를 기반으로, 인증, 인가 기능을 제공하는 인터페이스이다. 현재 서비스에서 사용하고 있는 User 클래스에 implements 하여, 기존 클래스에 인증, 인가 관련 기능을 부여한다.

해당 클래스 인스턴스를 기반으로, Spring 서버 내에서 인증, 인가 작업을 수행하는 것이다.

실무에 사용하는 경우, 서비스에 따라 추가적인 사항이 더 필요한 경우가 많아, UserDetail 인터페이스를 상속받는 커스텀 UserDetail 클래스를 만들어 사용하는 것이 관례이다.

  • getAuthorities() : 계정의 권한 목록을 리턴한다.
  • getPassword() : 계정의 비밀번호를 리턴한다.
  • getUsername() : 계정의 고유한 값을 리턴한다. (중복 없는 이메일, PK)
  • isAccountNonExpired() : 계정의 만료 여부를 리턴한다.
  • isAccountNonLocked() : 계정의 잠김 여부를 리턴한다.
  • isEnabled() : 계정의 활성화 여부를 리턴한다.

UserDetailsService

Spring Security 의 인증과정 중 실제 사용자 정보를 조회하기 위한 서비스 단으로, UserDetails 인스턴스를 생성하는loadUserByUsername() 메서드를 가지고 있다.

  • loadUserByUsername(String token) : 사용자의 토큰에서 claim 정보를 기반으로, 사용자를 조회하여, 조회된 정보를 기반으로 UserDetails 인스턴스를 생성한다.

Authentication

Authentication 은 현재 접근하려는 사용자의 정보와 권한을 담는 인터페이스이다.

AuthenticationProvider

인증에 대한 Provider 클래스를 생성 시에 사용되는 인터페이스로, 이를 implements 하는 경우 authenticate()supports() 메서드를 오버라이드 한다.

  • authenticate() : 실제 인증 로직 구현이 이루어지는 메서드로, 관련 로직 수행 후, Authentication 객체를 반환하도록 설정되어 있다.
  • supports() : 현재 Provider 클래스가 특정 타입의 Authentication 객체를 지원하는 여부를 알려주는 메서드이다. 만약 Provider 가 여러개인 경우, AuthenticationManager 내의 등록된 Provider 가운데, 주어진 Authentication 객체를 지원하는 지를 확인하는 용도로 사용할 수 있다.

AuthenticationManager

AuthenticationProvider 구현체를 관리하는 클래스이다. AuthenticationManager 해당 구현체를 등록하는 것으로 추후, 상황에 따라 필요한 AuthenticationProvider 클래스를 AuthenticationManager 를 통해 불러오는 것이 가능하다.

SecurityContext

Authentication 정보를 서버 내에서 보관하는 역할을 한다. 향후 인증이 필요한 요청에 대해 @AuthenticationPrincipal 어노테이션을 부여하는 것으로, SecurityContext 내의 Authentication 내의 사용자 정보를 가져오는 것이 가능하다.

UsernamePasswordAuthenticationToken

SpringSecurityUsernamePassword 를 기반으로 인증 및 권한 부여 정보를 설정하는 방식을 채택했다. 이 때 사용자에 대한 권한 부여 정보를 가진 클래스가 바로 Authentincation 이다.

UserDetails 클래스를 기반으로, Authentication 객체를 반환하는 클래스가 UsernamePasswordAuthenticationToken 이다.

GrandAuthority

현재 사용자가 가지고 있는 권한을 의미하며, ROLE_XX 등의 형태로 사용된다. 특정 자원에 대한 접근 시, 권한 여부를 확인하는데 사용되는 객체이다.

Spring Security의 처리 과정

  1. 사용자가 로그인 정보와 함께 인증 요청을 진행한다.
  2. AuthenticationFilter 가 해당 요청에 대하여 UsernamePasswordToken 객체를 생성한다.
  3. AuthenticationManager 에, 해당 UsernamePassowordToken 객체를 전달한다.
  4. AuthetincationManager 는 전달된 UsernamePassowordToken 객체의 인증을 지원하는 AuthenticationProvider 를 찾아, 인증을 요구한다.
  5. AutheticationProviderauthenticate() 메서드를 호출하여, 인증 로직이 수행되도록 한다. 인증 로직의 경우 서비스마다 차이는 있겠으나, 공통적인 수행 방식은 다음과 같다.
    • UserDetailsService 에서 해당 token 값의 claims 정보를 기반으로 해당하는 사용자를 찾는다.
    • 인증 과정을 수행한 후, 성공적으로 인증이 되었다면 해당 사용자 객체 정보를 기반으로 UserDetails 객체를 생성하여 반환한다.
    • 인증이 완료된 UserDetails 객체를 기반으로, 사용자 정보 및 권한 정보가 담긴 Authentication 객체를 생성한다.
    • Authentication 객체를 SecurityContext 에 저장한다. 향후 Controller 에서 사용자 정보나 권한 정보가 필요한 경우, @AuthenticationPrincipal 등을 사용하여, 필요한 객체 정보를 불러올 수 있다.

참고
Spring Security (3) - AuthenticationManager, AuthenticationProvider 동작 흐름 분석
[스프링 시큐리티] @AuthenticationPrincipal 로그인 정보 받아오기
🔒 Spring Security 구조, 흐름 그리고 역할 알아보기 🌱
Spring Security의 구조(Architecture) 및 처리 과정 알아보기

profile
새로운 것에 관심이 많고, 프로젝트 설계 및 최적화를 좋아합니다.

0개의 댓글