1.Spring Security |
-Spring MVC 기반 애플리케이션의 인증(Authentication)과 인가(Authorization or 권한 부여) 기능을 지원하는 보안 프레임워크로써, Spring MVC 기반 애플리케이션에 보안을 적용하기 위한 사실상의 표준
-Spring Security를 애플리케이션에 적용하여 할 수 있는 일
- 다양한 유형의 사용자 인증 기능 적용(폼 로그인 인증, 토큰 기반 인증, OAuth 2 기반 인증, LDAP 인증)
- 애플리케이션 사용자의 역할(Role)에 따른 권한 레벨 적용
- 애플리케이션에서 제공하는 리소스에 대한 접근 제어
- 민감한 정보에 대한 데이터 암호화
- SSL 적용
- 일반적으로 알려진 웹 보안 공격 차단
- SSO, 클라이언트 인증서 기반 인증, 메서드 보안, 접근 제어 목록(Access Control List) 같은 보안 기능 지원
-Spring Security 용어
● Principal(주체)
○ 애플리케이션에서 작업을 수행할 수 있는 사용자, 디바이스, 시스템
○ 일반적으로 인증 프로세스가 성공적으로 수행된 사용자의 계정 정보를 의미함
● Authentication(인증)
○ 애플리케이션을 사용하는 사용자가 본인이 맞음을 증명하는 절차를 의미함
○ 인증을 정상적으로 수행하기 위해서는 사용자를 식별하기 위한 정보, Credential(신원 증명 정보)이 필요함
● Authorization(인가 또는 권한 부여)
○ Authentication이 정상적으로 수행된 사용자에게 하나 이상의 권한(authority)을 부여하여 특정 애플리케이션의 특정 리소스에 접근할 수 있게 허가하는 과정을 의미함
○ Authorization은 반드시 Authentication 과정 이후에 수행되어야 하며, 권한은 일반적으로 역할(Role)의 형태로 부여됨
● Access Control(접근 제어)
○ 사용자가 애플리케이션의 리소스에 접근하는 행위를 제어하는 것을 의미함
2.Spring Security의 웹 요청 처리 흐름 |
-Spring Security의 웹 요청 처리를 이해햐기 위해, 먼저 보안이 적용된 웹 요청의 일반적인 흐름을 알아야함
-위 그림의 요청 처리 흐름은 아래와 같음
- (1)에서 사용자가 보호된 리소스를 요청함
- (2)에서 인증 관리자 역할을 하는 컴포넌트가 사용자의 크리덴셜(Credential, 일반적으로 사용자의 패스워드)을 요청함
- (3)에서 사용자는 인증 관리자에게 크리덴셜(Credential)을 제공함
- (4)에서 인증 관리자는 크리덴셜 저장소에서 사용자의 크리덴셜을 조회함
- (5)에서 인증 관리자는 사용자가 제공한 크리덴셜과 크리덴셜 저장소에 저장된 크리덴셜을 비교해 검증 작업을 수행함
- (6) 유효한 크리덴셜이 아니라면 Exception을 throw함
- (7) 유효한 크리덴셜이라면 (8)에서 접근 결정 관리자 역할을 하는 컴포넌트는 사용자가 적절한 권한을 부여받았는지 검증함
- (9) 적절한 권한을 부여받지 못한 사용자라면 Exception을 throw함
- (10) 적절한 권한을 부여받은 사용자라면 보호된 리소스의 접근을 허용함
2-1.웹 요청에서의 서블릿 필터와 필터 체인의 역할
-위의 일반 처리 흐름에서 알 수 있듯, 인증 관리자나 접근 결정 관리자 같은 컴포넌트가 중간에 웹 요청을 가로채 사용자의 크리덴셜과 접근 권한을 검증하는 것을 볼 수 있음
-이처럼 서블릿 기반 애플리케이션의 경우, 애플리케이션의 엔드포인트에 요청이 도달하기 전에 중간에서 요청을 가로챈 후 어떤 처리를 할 수 있는 적절한 포인트를 제공하는데 이것이 서블릿 필터(Servlet Filter)임
-서블릿 필터는 자바에서 제공하는 API로, javax.servlet.Filter 인터페이스를 구현한 서블릿 필터는 웹 요청(request)을 가로채어 어떤 처리(전처리)를 할 수 있으며, 또한 엔드포인트에서 요청 처리가 끝난 후 전달되는 응답(reponse)을 클라이언트에게 전달하기 전에 어떤 처리(후처리)를 할 수 있음
-서블릿 필터는 하나 이상의 필터들을 연결해 필터 체인(Filter Chain)을 구성할 수 있음
-위의 그림은 Spring Framework의 DispatcherServlet에 클라이언트의 요청이 전달되기 전에 필터 체인(Filter Chain)을 구성한 예시임
-만약 Filter 인터페이스를 구현한 다수의 Filter 클래스를 위의 그림처럼 구현했다면, 서블릿 필터에서 특별한 작업(개발자가 작성한)을 수행한 뒤, HttpServlet을 거쳐 DispatcherServlet에 요청이 전달되며, 반대로 DispatcherServlet에서 전달한 응답에 대해서도 역시 특별한 작업을 수행할 수 있음
2-2.Spring Security에서의 필터 역할
-위의 그림은 서블릿 필터에 Spring Security Filter가 추가된 모습으로, DelegatingFilterProxy 와 FilterChainProxy가 추가된 것을 확인할 수 있음
● DelegatingFilterProxy
○ Spring 에서 DI의 핵심은 Spring Container인 'ApplicationContext' 였음
○ Spring Security 만의 필터를 'ApplicationContext' 에 Bean으로 등록한 후에, 이 Bean들을 이용해서 보안과 관련된 여러 작업을 처리하게 되는데 DelegatingFilterProxy 가 Bean으로 등록된 Spring Security의 필터를 사용하는 시작점
○ 서블릿 컨테이너 영역의 필터와 ApplicationContext에 Bean으로 등록된 필터들을 연결해주는 브릿지 역할
● FilterChainProxy
○ Spring Security 에서 보안을 위한 작업을 처리하는 필터의 모음
○ Spring Security의 Filter를 사용하기 위한 진입점
○ Spring Security의 Filter Chain은 URL 별로 여러 개 등록할 수 있으며, Filter Chain이 있을 때 어떤 Filter Chain을 사용할지는 FilterChainProxy가 결정하며, 가장 먼저 매칭된 Filter Chain을 실행함
-이미지 및 내용 출처 : code states
'부트캠프' 카테고리의 다른 글
Spring Security - DelegatingPasswordEncoder (0) | 2023.03.21 |
---|---|
Spring Security - Filter 와 Filter Chain (1) | 2023.03.21 |
인증/보안 - 기초 (1) | 2023.03.15 |
Spring MVC - API 문서화 (0) | 2023.03.12 |
TDD(Test Driven Development) (0) | 2023.03.12 |