Spring Security

minbo2002·2022년 6월 15일
0

스프링부트

목록 보기
8/13
post-thumbnail

스프링 시큐리티(Spring Security)

인증과 권한 부여를 제공하는데 중점을 둔 프레임워크.
Spring기반 애플리케이션 보안의 표본이다.


용어

  • 접근 주체(Principal) : 보호된 application에 접근하려는 유저
  • 인증(Authentication) : 사용자가 누구인지 검증하는것. 쉽게 말해서 주민등록증과 비슷하다고 보면 된다.
  • 인가(Authorization) : 인증된 사용자가 특정 application의 동작을 할 수 있도록 허락되었는지 확인 및 결정하는것.

Spring Security 내부구조

스프링 시큐리티 동작은 여러개의 객체가 서로 데이터를 주고받으면서 이루어진다.

스프링 시큐리티의 간단한 흐름

핵심 역할은 Authentication Manager(인증 매니저)를 통해서 이루어지며,
AuthenticationProvider는 인증 매니저가 어떻게 동작해야하는지를 결정하며,
실제 인증은 UserDetailsService에서 이루어진다.

그림1에서 보면 Filter1,2,3,....N개의 Filter가 있다. 즉 스프링 시큐리티의 경우 여러개의 필터가 Filter Chain이라는 구조로 Request를 처리하게 된다. 이때 각 Filter는 스프링 Bean을 사용할 수 없기 때문에 별도의 클래스를 상속받는 형태가 많다.

스프링 시큐리티의 주요 필터

Filter의 핵심 동작은 Authentication Manager(인증 매니저)를 통해서 인증(Authentication)이라는 타입의 객체로 작업을 하게 된다.
이때 Authentication Manager가 가진 인증처리 메서드는 파라미터를 인증(Authentication) 타입으로 받고 return 타입도 인증(Authentication) 타입으로 받는다.

실제 동작에서 전달되는 파라미터는 그림2의 Filter중 UsernamePasswordAuthenticationFilter 내부에서 UsernamePasswordAuthenticationToken 이라는 객체를 만들고 이를 AuthenticationManager의 .authenticate( ) 메서드의 파라미터로 전달된다.
즉 스프링 시큐리티의 Filter의 주요 역할은 인증 관련된 정보를 토큰(Token)이라는 객체로 만들어서 전달한다는 의미이다.

스프링 시큐리티 로그인 인증처리 과정

1. 사용자의 요청이 Authentication Filter에 전달된다.
2. 요청에 따라서 UsernamePasswordAuthenticationFilter 내부에서 UsernamePasswordAuthenticationToken을 생성한다.
3. AuthenticationManager.authenticate( ) 메서드를 이용하여 토큰(Token) 객체를 전달하고 인증을 요청한다. 이때 AuthenticationManager는 인터페이스이므로 구현체인 ProviderManager가 관리하는 1개이상의 AuthenticationProvider(s)들에게 전달받은 토큰을 위임하여 인증을 요청한다.

4. AuthenticationProvider는 전달된 토큰(Token) 객체의 타입이 처리될 수 있는 존재인지 확인한다.
5. AuthenticationProvider는 내부적으로 UserDetailsService 인터페이스를 이용해서 실제로 인증을 위한 사용자의 정보를 가져온다.
6. UserDetailsService 인터페이스의 구현 클래스는 DB에 사용자 정보가 있는지 조회하고 UserDetails 인터페이스의 구현 클래스로 사용자의 정보들을 반환한다.
(7~10) AuthenticationProvider는 UserDetails 인터페이스의 구현 클래스에서 반환된 DB의 정보와 사용자가 제공한 인증정보(Token)를 대조한다.

  • 인증에 성공한다면 SecurityContext 클래스에 인증된 결과를 저장하고 SecurityContextHolder 클래스에 담는다.
    (이때 사용자의 정보는 Authentication 타입이다)
  • 인증에 실패한다면 SecurityContextHolder 클래스를 정리한다.

AuthenticationManager의 .authenticatio( ) 메서드의 반환값은 Authentication이라는 인증정보인데, 이 내부에는 Roles라는 권한에 대한 정보도 있다. 권한 정보로 사용자가 원하는 작업을 할 수 있는지 없는지에 대한 '허가'를 할 수 있다.
인가(Authorization)를 통해 접근제한을 걸 수 있다.

출처

profile
꾸준하게

0개의 댓글