Spring에서 제공하는 Security는
어떻게 이루어져 있는가?
Spring Security란?
--
Spring 프레임워크의 기반으로 만들어진 애플리케이션에서 보안을 담당하는 프레임워크이다.
주로 인증(Authentication), 권한 부여 또는 인가(Authorization), 보안 설정 등을 처리하는 데에 활용된다.
인증과 권한 또는 인가는 Filter 흐름에 따라서 처리된다.
Filter는 Servlet(Dispatcher Servlet)으로 가기 전에 동작하므로
간단하게 설명하자면 HTTP 요청을 먼저 받아서 컨트롤러에 넘기기 전에 해당 요청을 먼저 검증하여 올바른 요청인지 판단한다.
Dispatcher Servlet이란?
HTTP 요청을 가장 먼저 받아서 적합한 컨트롤러에 전달해주는 프론트 컨트롤러(Front Controller)이다.
자세하게는 클라이언트로부터 HTTP 요청이 오면 서블릿 컨테이너(Servlet Container)가 해당 요청을 받고
이 요청을 Dispatcher Servlet에게 전달해준다.
--
인증( Authentication ), 권한 부여 또는 인가(Authorization)
--
- 인증(Authentication) : 요청을 보낸 사용자가 본인인지 확인 및 등록된 사람인지 확인하는 것을 의미
- 인가(Authorization) : 인증된 사용자가 접근할 수 있는 요청인지 확인하는 것을 의미
인증에 대한 예시로는
쇼핑몰에 로그인을 하는 것을 생각하면 된다.
인가에 대한 예시로는
로그인 이후에 회원은 마이페이지와 같이 접근할 수 있는 페이지 요청이 있고
관리자 페이지와 같이 접근할 수 없는 페이지 요청을 생각하면 된다.
--
Spring Security 아키텍처
--
위 아케텍처 그림은 Spring Security에서 기본적으로 제공하는 인증 처리에 사용되는 모듈들이다.
1. Filter
Spring Security에는 다양한 Filter들로 구성되어 있고 이 Filter들은 체인으로 연결되어 있다.
체인으로 연결되어 있다는 것은 체인으로 연결된 Filter들이 순차적으로 모두 수행된다는 것이다.
요청이 들어오면 해당 Filter 체인을 통해 요청을 처리하게 된다.
그리고 각 Filter들은 각자의 보안 작업들을 수행하게 된다.
2. UsernamePasswordAuthenticationToken
사용자가 요청할 때 같이 전달한 아이디와 비밀번호를 담는 토큰(객체)이며
UsernamePasswordAuthenticationFilter라는 Filter에서 해당 토큰을 생성하게 되고
이 토큰을 AuthenticationManager로 전달한다.
3. AuthenticationManager
인증을 수행하는 핵심 컴포넌트로
전달 받은 인증 토큰( UsernamePasswordAuthenticationToken)을 기반으로 사용자를 인증하고,
성공 또는 실패 결과를 반환한다.
이 때 인증은 하나 이상의 AuthenticationProvider를 이용하여 인증을 수행한다.
4. AuthenticationProvider
실제 인증에 대해 처리하는 부분으로
각 AuthenticationProvider는 특정 인증 유형(아이디, 비밀번호, 토큰 인증 등)을 처리한다.
이 때 PasswordEncoder와 UserDetailsService를 이용하면서 처리하게 된다.
5. PasswordEncoder
인증(Authentication)과 인가(Authorization)에서 사용될 비밀번호의 인코딩 방식을 지정한다.
즉, 사용자의 비밀번호를 암호화하는 데에 사용되고
인증 과정에서 사용자가 요청할 때 전달한 비밀번호를 암호화하여 저장된 비밀번호와 비교한다.
6. UserDetailsService
사용자의 정보를 DB나 다른 저장소에서 가져오는 역할을 수행한다.
이 때 사용자의 정보를 가져와서 UserDetails 객체로 생성한다.
7. UserDetails
사용자의 정보를 나타내는 인터페이스이다.
주로 사용자의 아이디, 비밀번호, 권한 등의 정보를 담고 있다.
8. SecurityContextHolder
현재 실행 중인 스레드에 대한 SecurityContext를 제공한다.
주로 인증된 사용자 및 해당 권한을 추적하는 데에 사용된다.
9. SecurityContext
사용자의 보안 정보를 포함하는 컨텍스트이다.
주로 인증된 사용자의 정보를 저장하고 전역적으로 액세스하는 데에 사용된다.
사용자의 Authentication이 저장되어 있고
SecurityContextHolder를 통해서 사용자의 권한을 확인하고, 인가(Authorization) 결정을 한다.
10. Authentication
사용자의 인증 정보를 나타내는 인터페이스로
AuthenticationManager에 의해서 생성되고 인증 결과를 담는다.
--
'Spring Boot' 카테고리의 다른 글
결제 API 포트원 (구 아임포트)로 결제 시스템 구현하기 (0) | 2024.04.23 |
---|---|
JWT를 이용하여 로그인 구현하기 (+ Refresh Token ) (0) | 2024.04.21 |
자동으로 데이터의 생성일, 수정일, 생성자, 수정자 저장하기 (Auditing) (0) | 2024.01.22 |
상태 코드 반환하기 (0) | 2024.01.18 |
application.yaml에 작성한 내용 설명 (0) | 2023.12.22 |