티스토리 뷰

Java+Spring/Spring

[Spring]Spring Security

Vagabund.Gni 2022. 9. 21. 21:16
728x90
반응형

스프링 시큐리티는 2003년 발표된 인증(Authentication), 권한 부여(Authorization)보안 프레임워크이다.

 

2022년 현재 버전 5까지 나와있으며, 스프링을 기반으로 한 엔터프라이즈 앱 보안의 사실상 표준이다.

 

버전 3 기준으로 대략 아래와 같은 모듈 구조를 가지고 있으며,

 

스프링 시큐리티를 사용하면 즉시 다음과 같은 작업을 지원하기 때문에

 

  • 다양한 유형(폼 로그인, 토큰 기반, OAuth 2 기반)의 인증
  • 사용자의 역할에 따른 권한 레벨 및 리소스에 대한 접근 제어
  • TLS 적용 및 민감한 정보 암호화
  • 알려진 보안 공격 차단
  • 다양한 커스터마이징 및 유연한 확장

개발자가 직접 보안 기능을 구현할 수 있음에도 스프링 시큐리티를 사용하는 것이 안전한 선택이 된다.

 

진도를 더 나가기 전에, 스프링 시큐리티에서 많이 쓰이는 용어부터 정리하고 가자.

 

Terminology

 

User, Principal

 

인증을 시도하는 주체User, 주체의 구체적인 정보(Username ID)Principal이라고 한다.

 

실제로는 혼용돼서 사용되는 듯하며, 보통 Entity 클래스에 그 정보가 담긴다.

 

Authentication

 

인증은 User, 혹은 Principal이 본인이 맞음을 증명하는 절차를 말한다.

 

정상적인 인증을 위해 제출하는 식별 정보를 Credential(신원 증명 정보)라고 하며, 일종의 신분증 역할을 한다.

 

공인인증서, OTP, 사이트 비밀번호 등이 그 예가 된다.

 

Authorization

 

 권한 부여, 혹은 인가는 인증을 통과한 사용자에게 역할(Role)에 따라 특정 권한(Authority)을 부여하는 절차이다.

 

여기서 권한이란 사용하는 앱의 특정 리소스에 접근할 수 있는 권한을 말하며,

 

사용자에 따라 권한을 제어하는 행위를 따로 접근 제어(Access Control)라 부르기도 한다.

 

권한 부여는 당연하게도 반드시 인증과정 이후에 수행되어야 한다.

 

이상의 용어를 그림으로 나타내면 대략 아래와 같이 된다.

 

 

Workflow

 

계속해서 스프링 시큐리티의 요청 처리 흐름에 대해서 알아보자.

 

사실 애플리케이션을 구현하면서 직접 스프링 시큐리티의 일처리를 느끼기는 쉽지 않은데,

 

내부적으로 알아서 처리하는 부분이 많기 때문이다.

 

하지만 지금 사용하고 있는 기술의 위치와 대략적인 흐름을 파악하고 있는 건 도움이 되므로,

 

천천히 알아보기로 한다.

 

General Overview and Servlet Filters

 

먼저 보안이 적용된 웹 요청의 일반적인 흐름을 보자.

 

먼저 클라이언트가 크리덴셜과 함께 요청을 보내면 크리덴셜 저장소에서 정보를 가져온다.

 

이어서 인증 관리자크리덴셜 검증권한 부여 관리자권한 검증을 거쳐 리소스 접근을 허용하는 것을 확인할 수 있다.

 

혹은 클라이언트의 요청을 두 관리자가 중간에 가로채서 검증하는 것이라고 볼 수도 있는데,

 

서블릿 기반 애플리케이션의 경우 이와 같은 처리를 할 수 있는 서블릿 필터(Servelet Filter)라는 API를 제공한다.

 

즉, 서블릿 필터는 요청을 가로채 전처리와 후처리를 할 수 있는 인터페이스의 모음이다.

 

javax.servlet.Filter를 구현한 서블릿 필터는 아래와 같은 필터 체인을 구성할 수 있다.

 

디스패처 서블렛에게 보내는 클라이언트의 요청을 가로채 필터링을 하는 것을 확인할 수 있다.

 

위에서 알아본 인증과 권한부여 같은 과정도 일종의 필터링이라 할 수 있는데,

 

스프링 시큐리티에선 바로 이 보안과 관련된 필터링을 지원한다. 

 

Spring Security

 

계속해서 스프링 시큐리티에서 지원하는 보안 관련 필터링의 작업 흐름을 알아보자.

 

위의 그림에 추가 필터를 끼워넣으면 된다.

 

중간에 스프링에서 지원하는 필터프록시 클래스가 두 개 들어간 것을 확인할 수 있다.

 

스프링 시큐리티도 앱 실행 시 필터를 스프링 컨테이너에 빈으로 등록하는데,

 

DelegatingFilterProxy 클래스의 경우 스프링 컨테이너에 빈으로 등록된 스프링 시큐리티 필터를 사용하는 시작점이 된다.

 

즉 자체적으로 보안에 관련된 작업을 하는 것이 아니라 서블렛 필터와 스프링 시큐리티 필터를 연결하는 가교 역할을 한다.

 

계속해서 FilterChainProxy의 역할을 보기 위해 아래 그림을 보자.

 

스프링 시큐리티 필터가 들어오면서 끊어졌던 흐름이 다시 이어진 것을 확인할 수 있다.

 

조금 구체적으로는 FilterChainProxy에 Spring Security Filter Chain이 연결된 모습인데,

 

이 체인은 이름대로 스프링 시큐리티에서 보안을 위한 처리를 하는 필터의 모음이다.

 

여기서 FilterChainProxy는 바로 이 보안 필터 체인을 사용하기 위한 진입점으로 기능한다고 보면 된다.

 

또한 그림에서 본 것 외에도 하나의 URL에 복수의 필터 체인을 등록할 수 있으며,

 

어떤 필터 체인을 먼저 사용할지 결정하는 것 역시 FilterChainProxy의 역할이다.

 

Summary

 

  • Spring Security는 스프링 기반 앱의 보안 표준이다.
  • 권한 부여(Authorization)는 반드시 인증(Authentication) 후에 수행된다.
  • 서블릿 필터는 요청을 가로채 처리하는 자바 API이다.
  • Spring Security 필터는 보안 관련 작업을 하며 Spring Security Filter Chain은 그 모음이다.
  • DelegatingFilterProxy는 기존 필터와 Spring Security 필터를 연결하는 역할을 한다.
  • FilterChainProxy는 Spring Security Filter Chain을 사용하기 위한 진입점이다.
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함