Spring Security
본문 바로가기
Spring

Spring Security

by IYK2h 2021. 9. 10.
728x90

Spring Security는

Spring 기반 애플리케이션에 인증과 권한 부여를 모두 제공하는 데 중점을 둔 프레임워크. 사실상 Spring 기반 애플리케이션 보안의 표본이다.

Spring Security는 "인증"과 "권한(인가)"에 대한 부분을 Filter의 흐름에 따라 처리합니다.

Spring Security는 보안과 관련해서 체계적으로 많은 옵션을 제공해주기 때문에 개발자 입장에서는 일일이 보안 관련 로직을 작성하지 않아도 된다는 장점이 있다.

Spring Security는 기본적으로 인증 절차를 거친 후에 인가 절차를 진행하게 되며, 인가 과정에서 해당 리소스에 대한 접근 권한이 있는지 확인을 하게 된다.

Spring Security에서는 이러한 인증과 인가를 위해 Principal을 아이디로, Credential을 비밀번호로 사용하는 Credential 기반의 인증 방식을 사용한다.

용어 정리

  • 접근 주체(Principal) : 보호된 Resource에 접근하는 유저
  • 비밀번호(Credential): Resource에 접근하는 대상의 비밀번호
  • 인증(Authenticate) : 접근 주체가 누구인지 확인
  • 인가(Authorize) : 어떤 Resource에 접근할 수 있는 권한이 있는지 검사(ex. admin, user)
  • 권한 : 인증된 주체가 Resource를 접근할 수 있도록 권한을 결정
    • 웹 요청 권한, 메소드 호출 및 도메인 인스턴스에 대한 접근 권한 부여로 두 가지 영역이 존재
  • 비슷해 보이지만 다른 두 친구를 소개합니다. Authentication vs Authorization | 아웃풋 트레이닝

Spring Security의 구조

인증 관련 architecture

Spring Security는 세션-쿠키 방식으로 인증

  1. http request 요청
  2. AuthenticationFilter를 통해 (2→6) User까지 간다
  3. User에 있는 유저라면 UserDetails로 꺼내 session 생성 (7→0)
  4. spring security의 인메모리 세션 저장소인 SecurityContextHolder에 저장 (10)
  5. 유저에게 session ID와 함께 응답을 내려줌
  6. 이후 요청에서는 요청 쿠키에서 JSESSIONID를 까 봐서 검증 후 유효하면 Authentication를 쥐어준다.

Spring Security 필터 체인 구조

각 필터 별 기능 설명

  • SecurityContextPersistenceFilter SecurityContextRepository에서 SecurityContext를 가져오거나 저장하는 역할 담당
  • LogoutFilter 지정된 로그아웃 URL에 대한 요청을 감시하며, 매칭 되는 해당 유저를 로그아웃 처리
  • UsernamePasswordAuthenticationFilter 사용자명과 비밀번호로 이뤄진 폼 기반 인증에 사용하는 가상 URL요청을 감시하고 요청이 있으면 사용자의 인증을 진행
  • DefaultLoginPageGeneratingFilter 폼기반 또는 OpenID 기반 인증에 사용하는 가상 URL에 대한 요청을 감시하고 로그인 폼 기능을 수행하는데 필요한 HTML을 생성
  • BasicAuthenticationFilter HTTP 기본 인증 헤더를 감시하여 처리
  • RequestCacheAwareFilter 로그인 성공 후, 원래 요청 정보를 재구성하기 위해 사용
  • SecurityContextHolderAwareRequestFilter HttpServletRequestWrapper를 상속한
  • SecurityContextHolderAwareRequestWapper 클래스로 HttpServletRequest 정보를 감싼다.
  • SecurityContextHolderAwareRequestWrapper 클래스는 필터 체인상의 다음 필터들에게 부가정보를 제공
  • AnonymousAuthenticationFilter 이 필터가 호출되는 시점까지 사용자 정보가 인증되지 않았다면 인증 토큰에 사용자가 익명 사용자로 나타난다
  • SessionManagementFilter 인증된 주체를 바탕으로 세션 트래킹을 처리해 단일 주체와 관련한 모든 세션들이 트래킹 되도록 도운다.
  • ExceptionTranslationFilter 이 필터는 보호된 요청을 처리하는 중에 발생할 수 있는 예외를 위임하거나 전달하는 역할을 한다.
  • FilterSecurityInterceptor 이 필터는 AccessDecisionManager로 권한 부여 처리를 위임함으로써 접근 제어 결정을 쉽게 해 준다.

특징

  • 독립적인 운용을 지향
  • 인증 및 권한 부여 모두에 대한 포괄적이고 확장 가능한 지원
  • 세션 고정, 클릭재킹, 사이트 간 요청 위조 등의 공격으로부터 보호
  • 서블릿 API 통합
  • Spring Web MVC와의 선택적 통합, 즉 독립적
  • ...

기능

  • 사용자 권한에 따른 URI 접근 제어
  • DB와 연동하는 Local strategy 로그인
  • 쿠키를 이용한 자동 로그인
  • 패스워드 암호화

 

Reference

공식문서

Spring Security

Contents(한글)

 

참고 중

 

728x90

'Spring' 카테고리의 다른 글

Java Bean? Spring Bean?  (0) 2022.04.29
Spring DI 종류  (0) 2022.04.22
Spring IoC, DI 가 무엇인지  (0) 2022.04.19
Spring-JPA-hibernate.naming  (0) 2022.03.22
Filtet vs Interceptor  (0) 2022.03.18

댓글