# Spring Security - 주요 아키텍처 이해 [2]

uuuu.jini·2022년 3월 2일
0

Spring Security

목록 보기
5/5
post-thumbnail

🐯SecurityContextPersistenceFilter

SecurityContext객체의 생성, 저장 , 조회 하는 필터이다.

익명 사용자

인증을 하지 않은 채로 자원에 접근하는 사용자이다. 익명 사용자가 요청을 하는 경우 필터는 새로운 SecurityContext객체를 생성하고 holder에 저장한다. AnonymousAuthenticationFilter에서 AnonymousAuthenticationToken객체를 SecurityContext에 저장한다.

인증 시

새로운 SecurityContext객체를 생성하여 holder에 저장한다. UserNamePassowrdAuthenticationFilter에서 인증 성공 후 SecurityContext에 UsernamePasswordAuthenticationToken 객체를 SecurityContext에 저장한다. 인증이 최종 완료되면 Session에 SecurityContext를 저장한다.

인증 후

Session에서 SecurityContext 꺼내서 SecurityContextHolder에 저장한다. SecurityContext안에 Authentication객체가 존재하면 계속 인증을 유지한다.

최종 응답 시 공통

SecurityContextHolder.clearContext()

Filter 흐름

  • 사용자 요청

  • SecurityContextPersistenceFilter는 매 요청마다 요청을 처리한다. (사용자 관계없이)

  • 내부적으로 HttpSecurityContextRepository 클래스를 가지고 있으며 이 클래스가 SecurityContext객체를 생성,조회하는 역할을 한다.

  • 인증 전 : SecurityContext(인증객체null)를 생성한후 SecurityContextHolder에 저장한다. AuthFilter(인증필터)로 이동하여 인증을 처리한다.

  • 인증이 완료된 경우 : 인증 후엔 SecurityContext객체 내에 Authentication객체(최종 인증 성공한 사용자 정보)를 저장한다. 다음 필터를 수행한 후 SecurityContext를 Session에 저장한다.(응답하는 시점에서) 세션에 저장한 후 SecurityContext를 holder에서 제거한후 응답을 한다.

  • 인증 이미 완료되어있는 경우 : 세션에서 해당 Authentication객체를 가진 SecurityContext객체를 가져온 후 다음 필터를 수행한다.

즉, 해당 필터는 인증을 받기전에는 새로운 SecurityContext 객체를 생성하는데 해당 객체안에 인증객체는 null인 상태로 존재하며, 인증 성공 후에는 인증 필터가 SecurityContext 객체안에 저장성공한 인증객체(Authentication객체)를 저장해 둔다. ( 다시 인증을 요청할 시 세션에 저장되어 있는 SecurityContext를 가져와서 인증을 재처리해준다. )


🐯 Authentication Flow

인증의 흐름으로 요청을 받아서 인증처리를 한다.
1. client의 로그인 요청
2. UsernamePasswordAuthenticationFilter(폼로그인 인증처리)가 요청을 받아서 Authentication인증 객체를 생성한다. (id+password) AuthenticationManager에 생성한 인증객체를 보내고 인증처리를 맡긴다.
3. AuthenticationManager는 인증의 전반적인 관리를 하며, 실제 인증역할은 하지않고 적절한 AuthenticationProvider에게 위임을 한다.
4. AuthenticationProvider 가 실제 인증 처리를 하며, 유저 유효성 검증(패스워드 체크 등)을 수행한다.
5. UserDatilsService인터페이스에서 유저객체를 조회하고 UserDetails타입으로 변환한다. --> Repository

위의 과정으로 인증을 수행하며 만약 User객체가 존재하면, 해당 객체를 반환하고, 예외가 발생하게 되면 UsernamePasswordAuthenticationFilter로 인증실패를 알려준다.

인증이 성공하여 user를 반환하면 AuthenticationProvider에서는 해당 인증이 성공한 객체의 정보를 담은 Authentication 인증 토큰 객체를 생성하여 반환해준다. 마지막으로는 SecurityContext에 인증 객체를 저장한다.


🐯 AuthenticationProvider

실질적으로 인증처리를 할 때 핵심적인 역할을 한다. id,password 정보를 받아서 실제 검증을 하는 클래스이다. (추가적인 검증또한 가능 ) 최종 인증이 성공하면 성공인증객체를 생성한후 Manager에게 넘겨주는 역할을 한다.

해당 클래스도 interface이며 보통 구현하여 인증처리를 한다. 두개의 메서드가 제공되며 authenticate(authentication)supports(authentication) 이 있다. 전자는 실제 인증처리 검증을 후자는 인증처리할 수 있는 조건/기준이 되는지를 검사한다.

authenticate() 는 필터로부터 받은 인증객체(id,password)를 전달 받는다. 이 정보로 시스템에 저장된 해당 사용자의 계정과 일치하는지 검증을 진행한다. - ID 검증, Password 검증, 추가 검증 로직을 구현한다.

  • ID 검증 : UserDetailsService로 부터 실제 계정이 있는지를 검증 , UserDetails 객체로 반환 ( 성공 시 )
  • Password 검증 : 반환받은 UserDetails 타입의 객체에는 password가 존재하므로 비교를 하여 일치하지 않는 경우에는 예외(BadCredentialException)를 발생시킨다.
  • 추가 검증 이후 Authentication 인증 객체(인증 성공한 사용자 정보 user객체, 권한정보를 가짐 ) 를 생성한 후 해당 객체를 AuthenticationManager에게 전달한다.

🐯 Authorization, FilterSecurityInterceptor

Authorization은 인가를 의미하며, 인증을 받은 사용자가 어떤 특정 자원에 접근하고자 할때 접근할 자격이 되는지를 말하며 당신에게 무엇이 허가되었는지 증명하는 것이다.

SpringSecurity는 Authentication(인증)과 Authorization(인가) 두가지 영역으로 구분된다.

스프링 시큐리티가 지원하는 권한 계층

  1. 웹 계층 : url요청에 따른 메뉴 혹은 화면단위의 레벨 보안
  2. 서비스 계층 : 메소드 같은 기능 단위의 레벨 보안
  3. 도메인 계층(Access Control List, 접근 제어 목록 ) : 객체 단위의 레벨 보안

FilterSecurityInterceptor

마지막에 위치한 필터로써 인증된 사용자에 대하여 특정 요청의 승인/거부 여부를 최종적으로 결정한다. 인증객체 없이 보호자원에 접근을 시도할 경우 AuthenticationException 을 발생시키며, 이증 후 자원에 접근 가능한 권한이 존재하지 않을 경우 AccessDeniedException을 발생시킨다. 권한 제어 방식 중 HTTP 자원의 보안을 처리하는 필터이다. 권한 처리를 AccessDecisionManager에게 맡긴다.


🐯 AccessDecisionManager,AccessDecisionVoter

AccessDecisionManager

인증정보,요청정보,권한정보를 이용해서 사용자의 자원 접근을 허용할 것이지 거부할 것인지를 최종 결정하는 주체이다. 여러개의 Voter를 가질수 있으며 Voter로부터 접근허용,거부,보류에 해당하는 각각의 값을 리턴받고 판단 및 결정을 한다. 최종 접근 거부시 예외를 발생시킨다.

접근 결정의 세가지 유형

  • AffirmativeBased : 여러개의 Voter클래스 중 하나라도 접근 허가로 결론을 내면 접근허가로 판단
  • ConsensusBased : 다수표에 의해 최종 결정을 판단(동수일경우 접근허가 )
  • UnanimousBased : 모든 보터가 만장일치로 접근을 승인해야 한다.

AccessDecisionVoter

판단을 심사하는 주체(위원) 으로서 Voter가 권한 부여 과정에서 판단하는 자료로는 Authentication(인증정보),FilterInvocation(요청정보, antMatcher()), ConfigAttrivutes(권한정보,hasRole()) 이 있으며, 결정 방식에는 ACCESS_GRANTED(허용),ACCESS_DENIED(거부),ACCESS_ABSTAIN(보류)가 있다.


profile
멋쟁이 토마토

0개의 댓글