https://notion-ga.ohwhos.now.sh/collect?tid=UA-172038951-1&host=lightblog.me&page=/spring/spring-security

스프링 시큐리티란?

인증, 인가, 일반적인 공격에 대한 보호를 제공하는 프레임워크입니다.

스프링 시큐리티는 인증(Authentication: 사용자가 누구인지)과 인가(Authorization: 무엇을 허가받았는지)를 분리하여 아키텍쳐가 설계되었습니다. 여기서는 아키텍쳐와 인증 프로세스, 그리고 인증 프로세스에서 사용되는 주요 컴포넌트에 대해 살펴보겠습니다.

인증 (Authentication)

인증이란 컴퓨터 시스템 사용자의 신원(주소, 신분 등)같은 주장을 증명하는 행위입니다. 사람 또는 사물의 신원을 나타내는 행위와 대조적으로 인증은 그 신원을 검증하는 프로세스입니다. 즉, 인증이란 사용자 이름, 사용자 아이디, 사용자 비밀번호 등과 같은 자격을 증명하는 것을 검사하여 신분을 검증하는 것입니다.

이해의 편리를 위해 인증을 하는 프로세스 시나리오를 살펴보겠습니다.

  1. 사용자 이름과 암호를 입력받습니다.
  2. 사용자 이름과 암호가 올바른지 확인합니다.
  3. 인증이 완료되었습니다.
  4. 사용자가 가진 권한 이내의 작업을 수행할 수 있습니다.

이를 스프링 내부의 프로세스로 바꾸면 아래와 같습니다.

  1. 사용자의 이름과 암호를 입력받아 Authentication의 구현체인 UsernamePasswordAuthenticationToken 객체를 만듭니다.
  2. 만들어진 토큰을 AuthenticationManager로 전달합니다.
  3. AuthenticationManager를 통해 전달받은 토큰으로 사용자를 인증합니다.
  4. AuthetnicationManager가 반환한 AuthenticationSecurityContextHolder를 통해 SecurityContext에 넣습니다.
  5. 이후 SecurityContextHolder에 있는 Authentication에 부여된 권한에 이내의 작업을 수행할 수 있습니다.

위와 같은 프로세스는 보통 security interceptor에서 이뤄지는데 사용자가 직접 작성할 수도 있습니다. 웹에서 위와 같은 프로세스를 스프링 시큐리티의 필터와 인터셉터를 통해 처리해줍니다.

SecurityContextAuthetnication이 들어가는 과정 자체는 스프링 시큐리티가 신경쓰지 않습니다. 이를 이용해 제 3자가 제공하는 인증시스템과 상호 운용할 수 있습니다.

위의 프로세스에서 사용된 컴포넌트를 조금더 자세히 살펴보겠습니다.