Spring Security (스프링 시큐리티)
스프링 기반의 애플리케이션의 보안(인증, 권한, 인가)을 담당하는 스프링 하위 프레임워크
- 인증 (Authenticate) : 누구인가?
- 인가 (Authorize) : 무엇을 할 수 있는가?
Spring Security를 사용하지 않으면
- 매 요청마다 세션을 검사 → Authenticate (인증)
- 매 요청마다 유저의 권한을 검사 → Authorize (인가)
개념
- 접근주체 (Principal)
보호된 리소스에 접근하는 대상
- 인증 (Authentication)
보호된 리소스에 접근한 대상이 누구인지, 애플리케이션 작업을 수행해도 되는 주체인지 확인하는 과정 (Who?)
- 인가 (Authorize)
해당 리소스에 대한 접근 권한을 가지고 있는지 확인하는 과정 (Can?)
- 권한
리소스에 대한 접근 권한
- 모든 리소스에는 접근 제어 권한이 있음
- 인가 과정에서 해당 리소스에 대한 제한된 최소한의 권한을 가졌는지 확인
특징과 구조
- 보안과 관련해서 체계적으로 많은 옵션을 제공
- 필터 기반으로 동작 → MVC와 분리하여 관리 및 동작
- 애노테이션을 통한 간단한 설정이 가능
- 세션 & 쿠키 기반 인증
- 인증 관리자와 접근결정 관리자를 통해서 사용자의 리소스 접근을 관리
- 인증 관리자 (Authentication Manager)
→ UsenamePasswordAuthenticationFilter가 수행 - 접근결정 관리자 (Access Decision Manager)
→ FilterSecurityInterceptor가 수행
- 인증 관리자 (Authentication Manager)
작동 구조
- DispatcherServlet 앞 단에 Filter를 배치시켜 요청을 가로챔
- 클라이언트에 접근 권한이 없다면 인증화면으로 자동 리다이렉트
Filter
필터 | 기능 |
SecurityContextPersistenceFilter | SecurityContextRepository에서 SecurityContext를 로드하고 저장 |
LogoutFilter | • 로그아웃 URL로 지정된 가상 URL에 대한 요청을 감시 • 매칭되는 요청이 있으면 사용자를 로그아웃시킴 |
UsernamePasswordAuthenticationFilter | • 사용자명과 비밀번호로 이루어진 폼기반 인증에 사용하는 가상 URL 요청을 감시 • 매칭되는 요청이 있으면 사용자의 인증을 진행 |
DefaultLoginPageGeneratingFilter | • 폼기반 또는 OpenIP 기반 인증에 사용하는 가상 URL에 대한 요청을 감시 • 로그인 폼 기능을 수행하는데 필요한 HTML을 생성 |
BasicAuthenticationFilter | HTTP 기본 인증 헤드를 감시하고 처리 |
RequestCacheAwareFilter | 로그인 성공 이후 인증 요청에 의해 가로채어진 사용자의 원래 요청을 재구성 |
SecurityContextHolderAwareRequestFilter | HttpServletRequest와 HttpServletRequestWrapper를 상속하는 하위 클래스인 SecurityContextHolderAwareRequestWrapper로 감싸 필터 체인 하단에 위치한 요청 프로세서에 추가 컨텍스트를 제공 |
AnoymousAuthenticationFilter | 이 필터가 호출되는 시점까지 사용자가 아직 인증을 받지 못한 경우 요청 관련 인증 토큰에서 사용자가 익명 사요자로 나타나게 됨 |
SessionManagementFilter | 인증된 주체를 바탕으로 세션 트래킹을 처리해 단일 주체과 관련된 모든 세션들이 트래킹 되도록 함 |
ExceptionTranslationFilter | 보호된 요청을 처리하는 동안 발생할 수 있는 예외의 기본 라우팅과 위임을 처리 |
FilterSecurityInterceptor | 권한부여와 관련된 결정을 AccessDecisionManager에게 위임해 권한부여 결정 및 접근 제어 결정을 쉽게 해줌 |
사용법
1. build.gradle에 security 의존성 추가
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2. Java Config
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
}
}
• @Configuration
◦ bean을 등록하고 있음을 명시
• @EnableWebSecurity
◦ SpringSecurityFilterChain을 자동으로 등록
• @EnableGlobalMethodSecurity
◦ 스프링 시큐리티의 메서드 애노테이션 기반 시큐리티를 활성화
• WebSecurityConfigurerAdapter
[ 출처 ]
https://devuna.tistory.com/55
'TIL > Spring' 카테고리의 다른 글
[Spring] annotation 종류 (0) | 2022.05.06 |
---|---|
component-scan (0) | 2021.10.29 |