본문 바로가기
Web/Spring-Security

[Security] Spring Security (1)

by 희조당 2022. 10. 5.
728x90

✍️ 학습 목표

  • Spring Security란?
  • Architecture 이해하기

📌 Spring Security

스프링 프레임워크에서 보안(인증, 인가)을 담당하는 스프링 하위 프레임워크이다.

시큐리티를 공부하기 위해 짚고갈 용어들이 존재한다.

 

🔒 보안 용어

  • Authentication, 인증 : 애플리케이션을 접근하는 사람이 누구인지 확인하는 절차
  • Authorization, 인가 : 확인된 사용자의 권한을 확인하고 부여하는 절차
  • Principal, 접근 주체 : 접근하려는 대상
  • Credential, 자격증명 : 비밀번호, 열쇠와 같은 인증을 위한 키

정리하면 스프링 시큐리티는 보호된 리소스에 접근하는 대상이 '누구'인지 확인해주고

그 '누구'에게 부여된 권한에 맞게 기능들을 이용할 수 있게 한다.

 

✔️ 스프링 시큐리티의 특징

  • 보안에 대한 다양하고 편리한 옵션들을 제공한다.
  • 서블릿의 필터를 기반으로 동작한다. (MVC 패턴과의 분리)
  • 세션, 쿠기 방식을 사용하고 인증에 Credential 인증 방식을 사용한다.

📌 스프링 시큐리티 아키텍처

앞서 서술한 것처럼 스프링 시큐리티는 서블릿의 필터를 기반으로 동작한다.

기본적으로 스프링 프레임워크는 클라이언트의 요청을 DispatcherServlet이 받아서 처리한다.

요청들이 DispatcherServlet에 도착하기 전에 필터를 거치는데, 이 필터는 말 그대로 '필터'의 역할을 수행한다. 

필터와 서블렛을 체인처럼 엮으면 필터체인이라고 부른다.

✔️ DelegatingFilterProxy

애플리케이션의 인증과 권한 부여는 필터의 생명주기 동안 이루어지는데 서블릿 컨테이너는 빈을 인식할 수 없다.

스프링 시큐리티는 중간다리 역할을 하는 DelegatingFilterProxy을 제공한다.

 

이 프록시는 표준 서블렛 컨테이너 메커니즘을 그대로 따르고 모든 작업은 빈에게 위임한다.

여기서 가장 중요한 점은 지연 검색을 가능케 한다는 점이다.

// Example from Spring.io
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
   // ApllicationContext로부터 필터로 등록된 빈을 가져온다.
   Filter delegate = getFilterBean(someBeanName);
   // 빈에게 실제 작업을 시킨다.
   delegate.doFilter(request, response);
}

✔️ FilterChainProxy

DelegatingFilterProxy 내부에 존재하는 FilterChainProxy는 넘겨받은 요청과 응답을 스프링 시큐리티 필터 체인에 전달하고 작업을 위임한다.

DelegatingFilterProxy에서 바로 실행하지 않고 FilterChainProxy를 두는 이유는 다음과 같다.

 

🧐 왜 존재할까?

  • 서블릿 지원의 시작점 : 서블릿 관련 문제가 발생하면 시작점부터 확인해 나갈 수 있다.
  • 시큐리티의 중심 : SecurityContext 비워 메모리 누수를 방지하고, 외부의 공격으로부터 방화벽을 세우는 메인 기능을 수행하게 할 수 있다.
  • 유연한 호출 : 기존의 URL 기반의 호출 방식을 벗어나 RequestMatcher와 HttpServletRequest을 활용해 유연하게 호출을 결정할 수 있다.

✔️ SecurityFilterChain

인증을 처리하는 여러 SecurityFilter를 담는 필터 체인이다.

FilterChainProxy가 이 필터체인으로 클라이언트의 요청에 어떤 시큐리티 필터를 사용할지 결정한다.

✔️ SecurityFilter

클라이언트의 요청을 스프링 시큐리티 메커니즘에 따라 처리하는 필터이다.

SecurityFilterChain API를 통해 FilterChainProxy에 삽입되고 스프링 빈으로 등록된다.

순서가 존재하지만 모두 알아야 할 필요는 없다.


-Reference

https://docs.spring.io/spring-security/site/docs/5.4.2/reference/html5

 

 

댓글