공hannah부
Spring Security 본문
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에 위임해 권한 부여 결정 및 접근 제어를 처리
- 인증 객체가 존재하는지 확인 후, 접근하고자 하는 자원의 승인과 거부를 판단
'공부 > 백엔드' 카테고리의 다른 글
DDD (1) | 2023.11.21 |
---|---|
인증 방식의 종류 & JWT (0) | 2023.11.02 |
싱글톤 (Singleton) (0) | 2023.09.16 |
자바 ORM 표준 JPA 프로그래밍 CH08 (프록시와 연관관계 관리) (0) | 2023.07.17 |
자바 ORM 표준 JPA 프로그래밍 CH07 (고급매핑) (0) | 2023.07.10 |