[Spring] Spring Security-인증 구조

주운·2024년 3월 1일

Spring Security

알아보기

Spring Security는 인증, 권한 부여, 공격에 대한 보호를 제공하는 Spring의 하위 프레임워크다.

사실상 Spring 기반 애플리케이션의 표준 보안 프레임워크라 할 수 있다.

*여담
Spring Security는 기본적으로 세션 인증을 기반으로 한다.
jwt 토큰 인증을 사용하려면 세션 인증 기능을 끄고, jwt 인증을 끼워넣어야 한다.

Spring Security의 인증, 권한부여, 보호에 대한 자세한 내용은 다음과 같다.

인증

  • Sevlet 애플리케이션
  • WebFlux 애플리케이션
    두 환경 모두에 인증에 대한 포괄적인 지원을 제공한다.
    신원 확인을 위해 일반적으로 사용자 이름, 비밀번호 입력을 요구한다.

권한 부여

  • 요청 기반 승인
    • 모든 요청/특정 URL/특정 HTTP Method 등에 대해 인증을 요구할 수 있다.
  • 방법 기반 승인

공격에 대한 보호

  • CSRF
  • 보안 HTTP 헤더 제공
  • HTTPS로 리디렉션
  • 등등

아래의 내용은 sevlet 애플리케이션에서의 동작을 기반으로 한다.

Spring Security는 기본적으로 필터를 기반으로 한다.
필터는 Spring의 기능 중 하나로 HTTP 요청이 디스패쳐 서블릿에 도착하기 전 필요한 작업을 수행한다..

클라이언트의 요청에 대해 컨테이너는 filterChain을 실행한다.
체인 안에는 Filter인스턴스와 Servlet 인스턴스가 들어있다. 이 인스턴스들은 요청 URL을 기반으로 매칭되는 요청에 대한 작업을 처리한다.

서블릿 인스턴스는 Dispatcher Servlet의 인스턴스로, HTTP 요청이 처음 만나는 서블릿이다. 모든 요청에 대한 공통 작업을 처리하고 세부 작업 처리를 위해 URL이 매칭되는 컨트롤러에 요청을 전달한다.

필터체인

필터 프록시

인증 필터 추가

인증 아키텍쳐

Spring Security의 기능 중 인증의 구성요소와 절차를 살펴본다.
Spring Security의 인증에 사용되는 주요 구성요소는 다음과 같다.

SecurityContextHolder

  • 인증된 사용자의 정보(SecurityContext)를 저장한다.

SecurityContext

  • 인증된 사용자에게서 획득한다. Authentication을 포함한다.

Authentication

  • SecurityContext의 현재 사용자 혹은 사용자가 자격 증명을 제공하기 위해 AuthenticationManager에 입력한 내용을 담는다.
  • principal, credentials, authorities를 포함한다.
    • principal: 사용자 식별 정보. 아이디/비번 형식 인증이라면 일반적으로 UserDetails 인스턴스다.
    • credentials: 일반적으로 비밀번호다. 인증 후 유출 방지를 위해 지워진다.
    • authorities: GrantedAuthority 인스턴스다. 사용자의 역할과 권한 범위를 포함한다.

AuthenticationManager

  • SpringSecurity의 필터가 인증을 수행하는 방법을 정의한다.
  • AuthenticationManager의 구현은 무엇이든 될 수 있지만 일반적인 구현은 ProviderManager다.

ProviderManager

  • AuthenticationProvider 인스턴스 목록에 요청 위임
  • AuthenticationProvider은 인증 성공/실패/결정할 수 없음을 표시하거나 다음 AuthenticationProvider에 인증을 넘긴다.
  • 어떤 AuthenticationProvider도 인증할 수 없다면 ProviderNotFoundException 예외와 함께 인증이 실패한다.

AuthenticationProvider

  • ProviderManager에 여러 종류의 AuthenticationProvider를 삽입할 수 있다.
  • 예) 아이디-비밀번호 인증 provider, JWT 토큰 인증 Prodiver 등

AuthenticationManager 하나에 대한 bean만으로 다양한 인증을 지원할 수 있다.

인증 요청 방법

  • AuthenticationEntryPoint를 이용해 인증을 요청하는 HTTP 응답을 클라이언트에게 전송한다.
  • 사용자가 직접 비밀번호/아이디 등 인증정보를 전송한다면 인증 요청 HTTP 응답은 필요없다.
  • AuthenticationEntryPoint는 사용자가 인증되지 않은 요청을 시도할 때 로그인 페이지로 리다이렉트하기 등 으로 구현될 수도 있다.

AbstractAuthenticationProcessingFilter

  • 사용자의 자격증명(아이디/비번 등)을 인증하기 위한 필터

인증 동작 과정


1. 사용자가 제출한 자격증명에서 AbstractAuthenticationProcessingFilter는 요청으로부터 Authentication 생성한다.

  • Authentication의 종류는 구현된 Filter에 따라 결정된다.
  • 예) UsernamePasswordAuthenticationFilter가 아이디/비번으로 UsernamePasswordAuthenticationToken 생성

2. Authentication를 AuthenticationManager에 전달, 인증 수행한다.


3. 인증에 실패하면

  • SecurityContextHolder가 지워진다.

  • RememberMeServices.loginFail이 호출된다.. 기억이 구성되지 않은 경우에는 아무런 작업도 수행되지 않는다.

  • AuthenticationFailureHandler가 호출된다.

4. 인증에 성공하면

  • SessionAuthenticationStrategy가 새로운 로그인을 인식한다.
  • Authentication이 SecurityContextHolder에 등록된다.
  • RememberMeServices.loginSuccess가 호출된다.
  • ApplicationEventPublisher는 InteractiveAuthenticationSuccessEvent를 게시한다.
  • AuthenticationSuccessHandler가 호출된다.

0개의 댓글