이 글은 Fastcampus, Spring Security 강의를 보고 정리한 글이다.

 

스프링 시큐리티 아키텍처에 관한 설명은 아래 사이트가 가장 상세하다!

왜냐면, 스프링 공식 사이트이기 때문에 한번쯤 읽고 시작하는 것을 추천한다.

https://spring.io/guides/topicals/spring-security-architecture

 

Spring Security Architecture

this topical is designed to be read and comprehended in under an hour, it provides broad coverage of a topic that is possibly nuanced or requires deeper understanding than you would get from a getting started guide

spring.io

 

 

먼저 시큐리티의 중요 업무는 인증과 권한 부여다.

간단히 말해 인증은 누구세요? 라고 묻는 작업이고, 권한 부여는 말 그대로 그 유저가 무엇을 할 수 있는지 권한을 설정하는 것이다.

전체적인 스프링 시큐리티 흐름도는 아래와 같다.

 

위에서 결과 적으로 인증과 권한 설정에 관한 데이터가 담기는 곳은 SecutiryContext 부분이다.

이 부분을 Java에서 어떻게 가져와서 확인할 수 있을까?

 

SecurityContextHolder

- SecurityContext를 제공하는 static 메소드(getContext)를 지원한다.

 

SecurityContext

- 접근 주체와 인증에 대한 정보를 담고있는 Context이다.

 

Authentication

- Principal과 GrantAuthority를 제공한다.

- 인증이 완료되면 해당 Authentication이 저장되는 것이다.

 

Principal

- 유저에 해당되는 정보가 저장된다. (UserDetails)

 

GrantAuthority

- ROLE_ADMIN, ROLE_USER 등 Principal이 가지고 있는 권한을 나타낸다.

- prefix로 'ROLE_' 이 붙는다.

- 인증 이후 인가를 할 때 사용한다.

- 권한은 여러개 일 수 있기 때문에 Collection<GrantedAuthority>형태로 제공한다.

 

 

스프링 시큐리티에서 핵심은 Principal, GrantAuthority의 정보로 인증과 권한을 판단하게 된다.

스프링 시큐리티의 Context 기본 관리 전략은 ThreadLocal이다.

기본적으로 요청 1개에 Thread 1개가 생성된다.

 

ThreadLocal을 사용하면 Thread마다 고유한 공간을 만들수 있고 그곳에 SecurityContext를 저장할 수 있다.

공유 전략은 3가지이지만, 기본적으로 같은 Thread안에서만 공유하는 ThreadLocal 모드를 사용한다.

 

Security Filter 

Spring Security의 동작은 사실상 필터로 동작한다고 해도 무방할 만큼 다양한 필터가 존재하고

각자 다른 기능을 담당한다. 필터에 동작하는 순서를 정해줘서 원하는대로 유기적으로 동작할 수도 있다.

모든 필터는 interface Filter 를 상속받고 있고, doFilter 메소드를 통해 필터링을 수행한다.

따라서 요청 전, 응답 후 어떤 작업을 하도록하는 게 필터의 역할이다.

필터가 여러개라면 아래처럼 동작한다.

 

 

그렇다면, 주로 사용되는 Filter에 대해서 알아보자.

 

SecurityContextPersistenceFilter

- SecurityContext를 찾아서 SecurityContextHolder에 넣어주는 역할을 하는 필터다.

- 만약 없다면, 새로운 SecurityContext를 만들어 준다.

- 이때 SecurityContext를 어디서 찾는다는 걸까? 기본적으로 HttpSession에서 가지고 오게 된다.

- 세션유지에 필요한 세션아이디를 쿠키로 가지고 있어야되는데 그 값은 JSESSIONID라는 키에 넣어서 가지고 있게된다.

 

+ Recent posts