Spring Security

Viva의 놀이터·2022년 2월 20일
0

Spring Security

Security 구조

Spring Security의 구조는 위의 그림처럼 구정되어 있다.

용어 정리

  • SecurityContextHolder
    SecurityContext를 호출하는 getContext 메소드를 가지고 있다.

  • SecurityContext
    Authentication을 담고 있는 Context이다.

  • Authentication(인증)
    Principal, GrantAuthority를 제공하고 인증이 이뤄지면 저장되는 저장소이다.

  • Principal
    유저의 정보를 가지고 있다.

  • GrantAuthority(인가)
    ROLE_xxx 등의 Principal(유저 정보)에 담겨 있는 권한을 나타낸다.
    인증 이후의 해당 사용자의 권한을 확일 할 때 사용한다. 여기서 권한은 하나 이상을 가질 수 있다.

SecurityContext 정보 공유

Spring mvc 패턴의 프로젝트에서는 1개의 요청에 1개의 thread가 생성된다. (1번 api 호출을 하면 1개의 thread가 생성되어 해당 요청을 처리한다.)

ThreadLocal을 사용하면 생성된 thread에 고유한 공간을 생성할 수 있는데 그곳에 SecurityContext를 저장할 수 있다.

공유 전략

MODE_THREADLOCAL (Default)

ThreadLocalSecurityContextHolderStrategy를 사용한다.
ThreadLocal을 사용하여 같은 Thread안에서 SecurityContext를 공유한다.

MODE_INHERITABLETHREADLOCAL

InheritableThreadLocalSecurityContextHolderStrategy를 사용한다.
InheritableThreadLocal을 사용하여 자식 Thread까지도 SecurityContext를 공유한다.

MODE_GLOBAL

GlobalSecurityContextHolderStrategy를 사용한다.
Global로 설정되어 애플리케이션 전체에서 SecurityContext를 공유한다.

Security Filter

실질적으로 Spring Security가 동작하는 파트이다.
SecurityContextPersistenceFilter

SecurityContextPersistenceFilter는 요청이 들어온 thread의 SecurityContext를 찾아서 SecurityContextHolder에 등록시겨주는 역할을 하는 필터이다. 만약에 SecurityContext를 찾을 수 없다면 새로 생성하여 등록시켜준다.

Filter는 요청이나 응답에 대해 필터링 작업을 수행하는 개체로 doFilter 메소드에서 필터링을 수행한다. 즉 필터링 할 조건을 정의하고 실질적으로 필터링 작업을 수행하는 doFilter을 생성해야 한다.

이러한 Filter는 여러개를 생성할 수 있고 정해진 순서대로 수행된다.

자주 사용되는 filter

SecurityContextPersistenceFilter

SecurityContextPersistenceFilter는 요청이 들어온 thread의 SecurityContext를 찾아서 SecurityContextHolder에 등록시겨주는 역할을 하는 필터이다. 만약에 SecurityContext를 찾을 수 없다면 새로 생성하여 등록시켜준다.

어디서 SecurityContext를 가져오는거지?

SecurityContext를 가져오는 방법은 많지만 일반적으로 요청이 들어온 브라우저의 Session에서 가져온다. 브라우저는 서버와 통신을 할 때 이전에 로그인하여 사용 중이였다면 요청에 가지고 있는 쿠키를 넣어서 요청을 하게 되는 쿠키안에 SecurityContext가 들어있다.

BasicAuthenticationFilter

BasicAuthenticationFilter는 요청에 아이디와 비밀번호를 포함해서 보내면 이를 인식하고 인증하는 Filter다.
이는 SecurityContextPersistenceFilter와 달리 한번 인증된 세션을 재활용하는 것이 아닌 요청을 보낼 때 마다 인증이 이뤄지기 때문에 아이디와 비밀번호의 노출이 반복되고 이는 보안에 취약하다는 단점을 가지고 있다. 따라서 BasicAuthenticationFilter를 활용할 때에는 반드시 https 통신을 하여 보안을 향상해야한다.

profile
역사를 잊은 기술에겐 미래가 없다

0개의 댓글