2024. 1. 17. 21:13ㆍ스프링
깍 이제 진짜 ㄹㅇ 인증/ 인가에 대해서 공부를 제대로 해본다...
Spring에서는 기본적으로 위와 같은 Filter Chain을 통해 Controller의 앞 단에서 다양한 역할들을 수행한다.
즉, Command를 수행하기 앞 단에서 필요한 부분들을 수행하는거다.
이미지 변환 혹은 데이터 압축, 암호화, 인증, 로깅, 캐싱등 도메인 로직 외에 부가적으로 필요한 기능들을 수행한다.
그런데, 여기에 우리가 넣고 싶은 기능을 추가하려면 어떻게 할까?
Spring은 이를 위해 DelegatingFilterProxy 를 제공한다. DelegatingFilterProxy 는 Application Context와의 Bridge 역할을하여, 우리가 작성한 Bean들을 Filter, 정확히 말하면 ServletFilter에서 사용할 수 있게 해준다.
DelegatingFilterProxy에, Spring Security는 FilterChainProxy 를 제공하여 인증과 관련된 FilterChain을 적용할 수 있게 해준다.
이렇게 함으로써, Controller의 앞단에 올 수 있는 여러 필터들 중, 보안과 관련된 필터들의 시작 지점을 지정하고, 모아 놓음으로써 관련 기능들을 쉽게 관리하게 한 것이다.
또한, 요청에 따라 서로 다른 FilterChain이 적용되게 할 수 있는 기능도 적용할 수 있다. URL별로 인증 혹은 인가에 대해 다르게 처리해야한다던가 하는 이슈가 있을때 말이다.
이런식으로, SpringSecurity는 Filter를 기반으로 동작하면서 보안에 관한 여러 기능을 제공하는 Spring 관련 Framework라고 볼 수 있다!
인증처리 과정
Spring Security의 인증의 핵심이라고 할 수 있다.
Authentication 객체가 인증 정보를 담고 있고, 이를 통해 인증이 되어있는 여부를 확인하는게 핵심이라 할 수 있다.
Authentication 객체는 Principal, Credentials, Authorities를 담고 있다.
- Principal : User의 식별자로, User Id, Email과 같은 정보를 담고 있는 객체다.
- Credentials : Password와 같은 중요한 정보로, 유출방지를 위해 보통 인증된 이후에는 삭제된다.
- Authorities : 권한 정보로, 보통 Role 혹은 Scope(어떤 걸 수행할수 있는지)로 설정한다.
아래 사진은 참고로 하자!
주요 필터를 정리해보자면,
SecurityContextHolderFilter
SecurityContext 객체를 생성, 저장, 조회하는 역할을 한다.
CsrfFilter
CSRF 공격을 막는 필터다. CSRF공격은 유저가 특정 이미지, url등을 클릭할때 링크 또는 스크립트를 사용하여 서버측으로 의도치않은 HTTP요청을 전송하게 하여 정보를 빼내거나 조작하는 공격이다. 일반적으로 쿠키와 세션 기반으로 인증을 진행할때, 많이 일어날 수 있는 공격인데, 우리의 경우 Rest API를 통해 stateless하게 서버를 유지하고, JWT를 사용하기 때문에 꺼 놓아도 상관이 없다고 한다.
LogoutFilter
설정된 로그아웃 URL(default: /logout)로 요청이 들어오면, 세션을 무효화하고 쿠키를 삭제하고 SecurityContext를 비우는 역할을 한다.
UsernamePasswordAuthenticationFilter
설정된 로그인 URL(default: /login )로 요청이 들어왔을때, username과 password를 비교하여 실제 인증을 수행하는 Filter다. 마무리 되면, SecurityContext에 인증에 성공한 Authentication 객체가 저장된다.
DefaultLoginPageGeneratingFilter, DefaultLogoutPageGeneratingFilter
이름 그대로 로그인, 로그아웃 페이지를 띄우는 필터다. 여러분이 본 로그인 페이지가 이 필터들로 인해 떴다고 보면 된다.
SecurityContextHolderAwareRequestFilter
SecurityContext에 저장된 정보로 부터 Request를 구성해주는 필터다.
AnonymousAuthenticationFilter
익명 사용자에 대한 인증 처리 필터다. 앞단의 필터에서 SecurtiyContext에 Authentication 객체가 없으면, Authentication 의 구현제 중 하나인 AnonymousAuthenticationToken 을 SecurityContext에 설정한다.
ExceptionTranslationFilter
AccessDeniedException(인가예외)와 AuthenticationException(인증예외)을 처리하는 필터다.
AuthorizationFilter
권한을 확인하는 필터다.
'스프링' 카테고리의 다른 글
TIL 20240119-QueryDSL (0) | 2024.01.19 |
---|---|
TIL 20240118 (0) | 2024.01.18 |
TIL 20240116- AOP(Aspect-Oriented Programming) (0) | 2024.01.16 |
TIL 20240115- 뉴스피드 프로젝트 KPT 회고 (2) | 2024.01.15 |
TIL 20240110- MVC 패턴 (0) | 2024.01.10 |