인증, 인가, 일반적인 공격에 대한 보호를 제공하는 프레임워크입니다.
스프링 시큐리티는 인증(Authentication: 사용자가 누구인지)과 인가(Authorization: 무엇을 허가받았는지)를 분리하여 아키텍쳐가 설계되었습니다. 여기서는 아키텍쳐와 인증 프로세스, 그리고 인증 프로세스에서 사용되는 주요 컴포넌트에 대해 살펴보겠습니다.
인증이란 컴퓨터 시스템 사용자의 신원(주소, 신분 등)같은 주장을 증명하는 행위입니다. 사람 또는 사물의 신원을 나타내는 행위와 대조적으로 인증은 그 신원을 검증하는 프로세스입니다. 즉, 인증이란 사용자 이름, 사용자 아이디, 사용자 비밀번호 등과 같은 자격을 증명하는 것을 검사하여 신분을 검증하는 것입니다.
이해의 편리를 위해 인증을 하는 프로세스 시나리오를 살펴보겠습니다.
이를 스프링 내부의 프로세스로 바꾸면 아래와 같습니다.
Authentication
의 구현체인 UsernamePasswordAuthenticationToken
객체를 만듭니다.AuthenticationManager
로 전달합니다.AuthenticationManager
를 통해 전달받은 토큰으로 사용자를 인증합니다.
Authentication
(보통 #isAuthenticated()
가 true
를 반환)을 반환합니다.AuthenticationException
을 발생시킵니다.Authetnication
의 구현체가 아닐 경우) null
을 반환합니다.AuthetnicationManager
가 반환한 Authentication
을 SecurityContextHolder
를 통해 SecurityContext
에 넣습니다.
SecurityContextHolder
에 있는 Authentication
에 부여된 권한에 이내의 작업을 수행할 수 있습니다.
위와 같은 프로세스는 보통 security interceptor
에서 이뤄지는데 사용자가 직접 작성할 수도 있습니다.
웹에서 위와 같은 프로세스를 스프링 시큐리티의 필터와 인터셉터를 통해 처리해줍니다.
SecurityContext
에 Authetnication
이 들어가는 과정 자체는 스프링 시큐리티가 신경쓰지 않습니다.
이를 이용해 제 3자가 제공하는 인증시스템과 상호 운용할 수 있습니다.
위의 프로세스에서 사용된 컴포넌트를 조금더 자세히 살펴보겠습니다.