63DAYS) [Spring Security] 기본 - Spring Security 인증 구성요소 이해

nacSeo (낙서)·2023년 1월 16일
0

◉ 학습목표

1. Spring Security의 인증 처리 흐름을 이해할 수 있다.
2. Spring Security의 핵심 컴포넌트인 인증 컴포넌트의 역할을 이해할 수 있다.
  1. Spring Security의 인증 처리 흐름

✅ Before I Study

🗣️ Spring Security는 Spring Security Filter Chain을 통해 보안을 위한 특정 작업을 처리
🗣️ 사용자 인증 요청이 특정 Filter에 도달했을 때, Spring Security 컴포넌트들이 어떤 과정을 거쳐 처리하는지의 흐름을 학습해보자❗️

⦿ 학습내용

☞ Spring Security 컴포넌트로 보는 인증 (Authentication) 처리 흐름


✔︎ UsernamePasswordAuthenticationFilter

  • 사용자의 로그인 요청을 처리하는 Spring Security Filter

✔︎ UsernamePasswordAuthenticationToken

  • Authentication 인터페이스를 구현한 구현 클래스
  • 아직 인증이 되지 않은 Authentication을 의미

✔︎ AuthenticationManager

  • 인증 처리를 총괄하는 매니저 역할을 하는 인터페이스

✔︎ ProviderManager

  • AuthenticationManager를 구현한 구현 클래스

✔︎ UserDetails

  • 데이터베이스 등 저장소에 저장된 사용자의 Username과 사용자의 자격 증명을 해주는 크리덴셜(Credential)Password, 그리고 사용자의 권한 정보를 포함하고 있는 컴포넌트

✔︎ UserDetailsService

  • UserDetails를 제공하는 컴포넌트
  • 데이터베이스 등의 저장소에서 사용자 크리덴셜을 포함한 사용자 정보를 조회하여 AuthenticationProvider에게 제공

✔︎ UsernamePasswordAuthenticationFilter가 생성하는 Authentication

  • 인증을 위해 필요한 사용자의 로그인 정보를 가지고 있음

✔︎ AuthenticationProvider가 생성한 Authentication

  • 인증에 성공(⭐️)한 사용자의 정보(Principal, Credential, GrantedAuthorities)를 가지고 있음

✔︎ 인증된 Authentication을 전달받은 UsernamePasswordAuthenticationFilter

  • SecurityContextHolder를 이용해 SecurityContext에 인증된 Authentication 저장
  • SecurityContext는 이후 HttpSession에 저장되어 사용자의 인증 상태 유지
  1. Spring Security의 인증 컴포넌트

✅ Before I Study

🗣️ 앞서 알아본 흐름에 Spring Security에서 지원하는 인증 컴포넌트들의 내부 코드를 들여다 보며 처리 흐름을 확실히 내 것으로 만들자❗️

⦿ 학습내용

☞ UsernamePasswordAuthenticationFilter

✔︎ 클라이언트로부터 전달받은 Username과 Password를 Spring Security가 인증 프로세스에서 이용할 수 있도록 UsernamePasswordAuthenticationToken 생성

⭐️ doFilter() : Filter에서 어떤 처리를 하는 시작점

☞ AbstractAuthenticationProcessingFilter

✔︎ HTTP 기반의 인증 요청을 처리하지만 실질적인 인증 시도는 하위 클래스에 맡기고, 인증에 성공하면 인증된 사용자의 정보를 SecurityContext에 저장하는 역할

☞ UsernamePasswordAuthenticationToken

✔︎ Username/Password로 인증을 수행하기 위해 필요한 토큰
✔︎ 인증 성공 후, 인증에 성공한 사용자의 인증 정보가 UsernamePasswordAuthentivationToken에 포함되어 Authentication객체 형태로 SecurityContext에 저장

⭐️ unauthenticated() 메서드 : 인증에 필요한 용도의 UsernamePasswordAuthenticationToken객체 생성
⭐️ authenticated() 메서드 : 인증에 성공한 이후 SecurityContext에 저장될 UsernamePasswordAuthenticationToken객체 생성

☞ Authentication

✔︎ Spring Security에서의 인증 자체를 표현하는 인터페이스

☞ AuthenticationManager

✔︎ 인증 처리를 총괄하는 매니저 역할을 하는 인터페이스
✔︎ 인증을 위한 실질적인 관리는 AuthenticationManager를 구현하는 구현 클래스를 통해 이루어짐

☞ ProviderManager

✔︎ AuthenticationProvider를 관리하고, AuthenticationProvider에게 인증 처리를 위임하는 역할

☞ AuthenticationProvider

✔︎ AuthenticationManager로부터 인증 처리를 위임받아 실질적인 인증 수행을 담당하는 컴포넌트

⭐️ AuthenticationProvider인터페이스의 구현 클래스는 AbstractUserDetailsAuthenticationProvider이고,
DaoAuthenticationProviderAbstractUserDetailsAuthenticationProvider를 상속한 확장 클래스
⭐️ 따라서 AbstractUserDetailsAuthenticationProvider 추상 클래스의 authenticate() 메서드에서부터 실질적 인증 처리가 시작

☞ UserDetails

✔︎ 데이터베이스 등의 저장소에 저장된 사용자의 Username과 사용자 자격을 증명해주는 크리덴셜인 Password, 그리고 사용자 권한정보를 포함하는 컴포넌트
✔︎ AuthenticationProviderUserDetails를 이용해 자격 증명 수행

⭐️ 사용자의 정보를 메모리에서 로드하든 데이터베이스에서 로드하든 Spring Security가 이해할 수 있는 UserDetails로 리턴해주기만 하면 됨

☞ UserDetailsService

✔︎ UserDetails를 로드(load)하는 핵심 인터페이스

☞ SecurityContext

✔︎ 인증된 Authentication 객체를 저장하는 컴포넌트

☞ SecurityContextHolder

✔︎ SecurityContext를 관리하는 역할 담당

⭐️ SprnigContextHolder에 의해 SecurityContext값이 채워져 있다면, 인증된 사용자로 간주

⭐️ 그림과 같이,
SecurityContextHolderSecurityContext를 포함하고 있는 것은 SecurityContextHolder를 통해 인증된 AuthenticationSecurityContext에 설정 가능
⭐️ 또한,
SecurityContextHolder를 통해 인증된 Authentication객체에 접근할 수 있다는 것을 의미

◉ 느낀 점

☞ 학습 분량은 한정되어 있으나, 그 한정된 량의 압축된 이해해야할 정보들이 낯설고 많은 하루였다 ,,

Spring Security에서 지원하는 수많은 컴포넌트들을 만나봤고, 해당 코드들을 살펴보며 특징들을 파악할 수 있었는데...

겁나 어렵다 ... 다시 봐도 어렵고 ... 또 어렵다 ... 🤯🤯🤯

그렇지만, Spring Security가 아니였다면 ,, 배워야할 내용들이 더 어려웠겠지 ^^..? 라고 스스로 위로를 하며 무한 복습 ...

내일은 권한 부여에 관한 내용을 학습하게 된다.
Authentication과 Authorization의 차이점을 명확히 해둬야 내일 학습에도 도움될 것 같다 :)

◉ 내일의 키워드

・ Spring Security 권한 부여 구성요소 이해
profile
백엔드 개발자 김창하입니다 🙇‍♂️

0개의 댓글