Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
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
Tags
more
Archives
Today
Total
관리 메뉴

공hannah부

Spring Security 본문

공부/백엔드

Spring Security

Hannah0226 2023. 11. 2. 00:14

Spring Security

스프링 시큐리티란?

  • Spring 기반 어플리케이션의 보안(인증, 권한 부여 및 보호)을 담당하는 스프링 하위 프레임워크

보안용어 정리

  • 인증 (Authentication): 접근하려는 유저가 누구인지 확인하는 절차 ex)로그인
  • 인가 (Authorization): 인증된 사용자에 대해서 권한을 확인하고 허락하는 것
  • 접근 주체 (principal): 보호된 대상에 접근하는 유저, 아이디
  • 비밀번호 (credential): 대상에 접근하는 유저의 비밀번호

스프링 시큐리티 필터 체인

 

 

  • 일반적으로 클라이언트에서 서버로 요청을 보내면, 서블릿이 요청을 받아서 처리하고 응답을 클라이언트로 보냄
  • 이 과정 사이에 하나 이상의 필터들을 추가하여 요청이 필터를 거치도록 할 수 있음
  • 필터를 통과하면서 Request나 Response의 내용들을 변경하며, 가공된 데이터를 다음 필터 또는 서블리에 전달할 수 있고, 만약 필터에서 요청이 걸러진다면 필터 내부에서 자체적으로 Response 객체를 만들어 서블릿 대신 응답을 보낼 수 있음
  • 즉, 스프링 시큐리티는 인증과 인가에 대한 로직을 편하게 수행할 수 있도록 도와주는 일련의 필터 조합을 필터 단계에 집어넣는 것

 

  • 문제점: 필터는 스프링에 진입하기 전 단계의 처리를 담당하기 때문에, 스프링에서 생성한 빈을 인식할 수 없음  DelegatingFilterProxy(서블릿 필터의 구현체) 이용

DelegatingFilterProxy

  • 서블릿의 필터들과 스프링의 애플리케이션 컨텍스트 사이를 연결하는 역할을 제공
  • 내부에 스프링 시큐리티가 제공하는 Filter Chain Proxy가 있음
  • Filter Chain Proxy: Delegaing Filter Proxy를 통해 받은 요청과 응답을 Security Filter Chain에 전달하고, 작업을 위임하는 역할 
  • Security Filter Chain: 인증을 처리하는 여러개의 시큐리티 필터를 담는 필터 체인. 여러개로 구성될 수 있으며, 매칭되는 url에 따라 다른 시큐리티 필터 체인이 사용되도록 할 수 있음

 

인증과 관련된 Filter들

SecurityContextPersistenceFilter

  • SecutiryContext를 로딩하여 설정
  • SecutiryContext: 사용자의 아이디 비밀번호, 권한, 목록 등의 내용이 포함된 Authentication을 보관하는 역할을 하는 컴포넌트  
    • 처음 인증 혹은 사용자일 경우: SecutiryContext를 생성하여 SecurityContextHolger안에 저장하고 다음 필터 생성
    • 이력이 있을 경우: SecutiryContext를 꺼내와서 SecurityContextHolder에 저장

LogoutFilter

  • 로그아웃 요청시에만 실행되는 필터
  • 해당 경로로 요청이 왔을 경우에만 절차가 실행되고, 인증된 사용자를 로그아웃시키는 역할을 함

UserNamePasswordAuthenticationFilter

  • 아이디와 비밀번호를 사용하는 유저 인증 처리
  • 동작 원리
    • 요청으로 받은 로그인 정보를 통해 유저 아이디, 비밀번호, AuthenticationToken에 인증용 객체 생성
    • 생성한 토큰 객체를 AuthenticationManager의 구현체인 ProviderManager에게 전달
    • ProviderManager는 실제 인증을 수행하기 위해 활용되는 AuthenticationProvider 리스트를 가짐
    • AuthenticationProvider는 토큰에 들어있는 사용자명 즉, 아이디를 이용해 실제 DB에 저장된 사용자 정보를 UserDetails 객체에 담아 전달받음
    • AuthenticationProvider는 UserDetails에 들어있는 사용자 비밀번호를 토큰의 비밀번호와 비교하고, 일치하면 권한 등의 사용자 정보를 추가하여 객체 반환
    • 필터에 Authentication 객체가 반환되면, 이 객체를 SecurityContext에 저장

 

ConcurrentSessionFilter

  • 동시 세션과 관련된 필터
  • 하나의 계정으로 인증받은 사용자가 두명 이상일 때 실행됨
  • ex) 이미 로그인을 했는데 같은 계정으로 다른사람이 로그인을 시도하거나 다른 곳에서 다시 로그인을 시도할 때, 세션이 두개 이상으로 늘어남
  • ssesion.expireNow() 를 사용해 매 요청마다 현재 사용자의 세션이 완료되었는지를 확인

RememberMeAuthenticationFiltert

  • 세션이 사라지거나 만료되어도 쿠키 또는 DB를 사용하여 저장된 토큰 기반으로 인증을 처리
  • remember-me 기능을 활성화했는데 인증 세션이 완료되면, 현재 사용자가 요청하는 Request Header에 들어있는 remember-me 쿠키값을 가져와 사용자 대신 인증 처리 시도

AnonymousAuthenticationFilter

  • 사용자 정보가 인증되지 않았다면 익명 사용자 토큰을 반환
  • 필터가 호출되는 시점까지 인증 시도를 하지 않고 권한도 없이 어떤 자원에 바로 접속을 시도할 경우 실행 됨

SessionManagementFilter

  • 로그인 후 세션과 관련된 작업을 처리
  • 단계
    • SessionInfo 등록: 사용자의 세션 정보 등록
    • SessionFixation: 인증에 성공한 시점에 새롭게 쿠키가 발급되어서 이전에 있던 쿠키들은 삭제되고, 새로운 쿠키가 발급되도록 하는 단계
    • ConcurrentSession: 해당 사용자 계정으로 동 시점의 세션이 존재하는지 확인하는 단계

 

인가와 관련된 Filter들

ExceptionTranslationFilter

  • 인증, 인가 예외가 발생했을 경우 실행

FilterSecurityInterceptor

  • 권한 부여와 관련한 결정을 AccessDecisionManager에 위임해 권한 부여 결정 및 접근 제어를 처리
  • 인증 객체가 존재하는지 확인 후, 접근하고자 하는 자원의 승인과 거부를 판단