Spring Security 기반 인증 & 인가 처리
Spring Security 주요 개념
Spring Security 주요 용어 및 컴포넌트 요약
- 접근 주체(Principal) - 보호된 리소스에 접근하는 사용자
- Authentication으로 추상화
- 인증(Authenticate) - 현재 사용자가 누구인지 식별
- 주요 컴포넌트 - AuthenticationManager, AuthenticationProvider
- 인가(Authorize) - 현재 사용자가 보호된 리소스에 권한이 있는지를 검사
- 주요 컴포넌트 - AccessDecisionManager, AccessDecisionVoter
- GrantedAuthority
- 인증된 사용자의 인증정보(역할 등)을 표현
- SecurityContext
- 접근 주체(Authentication)와 인증정보(GrantedAuthority)을 담고 있는 Context
- ThreadLocal에 보관되며, SecurityContextHolder를 통해 접근할 수 있음
Spring Security Filter
기본 설정시 Spring Security는 일련의 서블릿 필터 체인을 자동으로 구성함
Spring Security 주요 필터 정리
- SecurityContextPersistenceFilter
- SecurityContextRepository를 통해 SecurityContext를 Load/Save 처리
- LogoutFilter
- 로그아웃 URL(기본값: /logout)로의 요청을 감시하여 해당 사용자를 로그아웃 시킴
- UsernamePasswordAuthenticationFilter
- ID/비밀번호 기반 Form 인증 요청 URL(기본값: /login)을 감시하여 사용자를 인증함
- ExceptionTransiationFilter
- 요청을 처리하는 중에 발생할 수 있는 예외를 위임하거나 전달
- FilterSecurityInterceptor
- 접근 권한 확인을 위해 요청을 AccessDecisionManager로 위임
- 이 필터가 실행되는 시점에는 사용자가 인증됐다고 판단
Spring Security 인증 처리 요약
인증(Authentication) 처리를 위한 핵심 컴포넌트
- UsernamePasswordAuthenticationFilter
- 사용자 인증 요청을 Authentication 인터페이스로 추상화하고, AuthenticationManager를 호출한다.
- Authentication 인터페이스에서 제공하는 핵심 메소드
- Object getPrincipal() - 인증 아이디
- Object getCredentials() - 인증 비밀번호
- Collection<? extends GrantedAuthority> getAuthorities() - 인증된 사용자의 권한 목록
- Object getDetails() - 인증된 사용자의 부가정보
- AuthenticaitonManager
- 사용자 아이디/비밀번호를 인증하기 위해 적절한 AuthenticationProvider 찾아 처리를 위임한다.
- AuthenticationProvider
- 실질적으로 사용자 인증을 처리하고, 인증 결과를 Authentication 인터페이스로 반환한다.
Spring Security 인가 처리 요약
인가(Authorization) 처리를 위한 핵심 컴포넌트
- AccessDecisionManager
- 인증된 사용자의 보호 리소스 접근 여부를 판단한다. 3개의 기본 구현을 제공한다.
- AffirmativeBased: 접근을 승인하는 voter가 1개 이상
- ConsesusBased: 과반수
- UnanimouseBased: 모든 voter가 승인해야 함
- AccessDecisionVoter
- AccessDecisionManager는 다수의 AccessDecisionVoter로 구성된다.
- 각각의 Voter는 주어진 정보를 기반으로 승인(ACCESS_GRANTED), 거절(ACCESS_DENIED), 보류(ACCESS_ABSTAIN)를 반환한다.
- RoleVoter는 보호 리소스에 접근하기 위한 구너환을 사용자가 지니고 있는지 확인함
- WebExpressionVoter는 SpEL 표현식에 따른 웹 접근제어를 처리함
인가 처리에 대한 기준을 조건에 따라 ACCESS_GRANTED, ACCESS_DENIED, ACCESS_ABSTAIN 3개 중 승인, 거절, 보류를 반환해주면 된다.
Spring 프로젝트는 오픈 소스니 코드를 보고 이해하는 능력을 키워야 한다. 문서만 보고 이해하기에는 어려운 부분이 있다. 조급해하지 말고 천천히 꾸준하게 익숙해져가는게 중요하다.
(프로그래머스) 단순 CRUD는 그만! 웹 백엔드 시스템 구현 온라인 스터디(Java반) 강의를 수강하고 제가 이해한대로 정리했습니다. 문제가 될시 삭제하겠습니다!