Koltin으로 개인 사이드 프로젝트를 진행하면서 제일 골치 아팠던것이 아무래도 Spring Security가 아니었지 싶다.
필요 이상으로 시간을 많이 쏟아붓기도 하였고, 개념이 정말 없다고 느꼈기 때문에, 처음부터 기초를 정리하면서 이해하고 넘어가고자 글을 작성한다.
Spring Security ?
Spring을 다뤄본 개발자라면 모두 들어봤을 "인증 (Authenticate) "
과 "인가 (Authorize)"
에 대한 부분을 컨트롤 할 수 있는 매우 유용한 프레임워크다.
개인적으로는 모두 중요하게 다뤄야할 보안, 인증, 권한 등 매우 쉽게 도와주는 프레임워크가 아닐까 싶다.
그도 그럴것이, 상당히 체계적으로 많은 옵션을 제공해주기 때문에 개발자 입장에서는 편한감이 없지 않아 있다.
혹시 인증과 인가에 대해서 모를까 싶어 정리하자면,
인증 Authenticate
인증은 시스템에 접근하기 위해 회원의 정보를 확인 하는 것이다. 인증은 인가 전에 완료되며,
쉽게 이해하자면 로그인이 그에 해당한다고 볼 수 있다.
인가 Authorization
만약 내가 특정 페이지나, 자원을 사용하고 싶을 때 권한을 체크한다고 생각하면 편할 것 같다.
여기서 사용자는 관리자의 자원에 접근하지 못하거나, 관리자는 사용자의 자원에 접근할 수 있게 하는 권한 또는 역할이 필요하다.
Spring Security Concept
기본적으로, Spring Security는 Filter개념으로 흘러간다.
Spring의 Dispatcher Servlet으로 가기전에 Filter가 적용된다.
흐름도
Client (request) → Filter → DispatcherServlet → Interceptor → Controller
(실제로 Interceptor가 Controller로 요청을 위임하는 것은 아님, Interceptor를 거쳐서 가는 것)
간단한 그림으로 흐름을 살펴보자
- 사용자는 기본적으로 로그인정보를 입력하여 서버에 요청을 보낸다. (Http Req)
- 처음으로 Authentication Filter가 이를 가로채고, UsernamePasswordToken이라는 객체를 생성하게 된다.
- 그 다음, Authentication Manager에게 위에서 발급한 UsernamePasswordToken을 전달한다.
- AuthenticationManager는 등록되어있는 AuthenticationProvider를 활용하여 인증을 요구한다.
loadByUsername
이라는 함수가 내장되어있는 UserDetailsService에게 사용자 정보를 넘긴다.- 실제로 넘겨받은 사용자 정보를 통해서 UserDetails라는 객체를 생성한다.
- 다시 AuthenticationProvider들은 넘겨받은 사용자정보를 비교한다.
- 인증이 완료되면 Authentication 객체를 반환
- 그리고 AuthenticationFilter에 객체를 반환
- 이후 SecurityContext에 Authentication 객체를 저장 처리한다.
그래서?
최종적으로는 SecurityContext에 Authentication객체를 저장하는것인데,
이는 Spring Security가 Session - Cookie 방식을 사용하고 있다는것과 의미가 같다.
Spring Security Filter
Spring Security에는 자동으로 설정되는 필터들이 존재한다.
- SecurityContextPersistenceFilter
- SecurityContextRepository 에서 SecurityContext 를 로딩하거나 SecurityContextRepository 로
SecurityContext 를 저장하는 역할을 한다. SecurityContext 란 사용자의 보호 및 인증된 세션을 의미한다.
- SecurityContextRepository 에서 SecurityContext 를 로딩하거나 SecurityContextRepository 로
- LogoutFilter
- 로그아웃 URL로의 요쳥을 감시하며 해당 사용자를 로그아웃 시킨다.
- UsernamePasswordAuthenticationFilter
- 아이디와 비밀번호를 사용하는 폼기반 인증 요청 URL 을 감시하며 사용자를 인증하는 역할을 한다.
- 해당 Filter를 상속받아 가장 많이 Custom하게 처리하는 필터가 아닐까 싶다.
- DefaultLoginPageGeneratingFilter
- 폼 또는 OpenId 기반 인증을 위한 로그인폼을 감시하고 이와 관련된 로그인 폼을 생성한다.
- BasicAuthenticationFilter
- HTTP 기본 인증 헤더를 감시하여 처리한다.
- RequestCacheAwareFilter
- 로그인 성공 후, 원래 요청 정보를 재구성하기 위해 사용된다.
- SecurityContextHolderAwareRequestFilter
- HttpServletRequestWrapper 를 상속한 SecurityContextHolderAwareRequestWrapper 클래스로
HttpServletRequest 정보를 감싼다. SecurityContextHolderAwareRequestWrapper 클래스는 필터
체인 상의 다음 필터들에게 부가정보를 제공한다.
- HttpServletRequestWrapper 를 상속한 SecurityContextHolderAwareRequestWrapper 클래스로
- AnonymousAuthenticationFilter
- 이 필터가 호출되는 시점까지 사용자 정보가 인증되지 않았다면 인증토큰에 사용자가 익명 사용자로
나타난다.
- 이 필터가 호출되는 시점까지 사용자 정보가 인증되지 않았다면 인증토큰에 사용자가 익명 사용자로
- SessionManagementFilter
- 이 필터는 인증된 사용자와 관련된 모든 세션을 추적한다.
- ExceptionTranslationFilter
- 이 필터는 보호된 요청을 처리하는 중에 발생할 수 있는 예외를 위임하거나 전달하는 역할을 한다.
- FilterSecurityInterceptor
- 이 필터는 AccessDecisionManager 로 권한부여 처리를 위임함으로써 접근 제어 결정을 쉽게 해준다.
- AbstractAuthenticationProcessingFilter
- 웹 기반 인증요청에서 사용되는 컴포넌트로 POST 폼 데이터를 포함하는 요청을 처리한다.
사용자 비밀번호를 다른 필터로 전달하기 위해서 Authentiaction 객체를 생성하고 일부 프로퍼티를 설정한다.
- 웹 기반 인증요청에서 사용되는 컴포넌트로 POST 폼 데이터를 포함하는 요청을 처리한다.
- AuthenticationManager
- 사용자 비밀번호를 인증하는 역할을 담당한다. 인증에 실패하면 예외를 던지기도 하고, 성공하면 Authentication
객체의 모든 프로퍼티를 완성한다. 이렇게 Authentication 객체에 채워지는 값에는 권한 정보도 포함되어 있다.
- 사용자 비밀번호를 인증하는 역할을 담당한다. 인증에 실패하면 예외를 던지기도 하고, 성공하면 Authentication
- AuthenticationProvider
- AuthenticationManager 에게 비밀번호 인증기능을 제공하는 역할을 한다.
데이터베이스를 참조하여 비밀번호를 인증하기도 한다.
- AuthenticationManager 에게 비밀번호 인증기능을 제공하는 역할을 한다.
마무리
개인적인 생각으로는 SpringSecurity에서 제일 중요한것은, Custom하게 처리할 Filter 또는, CORS, CSRF, 세션의 유효시간 및 탈취 위험 방지 등 이 있지 않을까 싶다.
하나하나 파고 들어가면 다루기가 상당히 힘들겠지만, 적어도 Spring Secuirty의 흐름과 역할에 대해서는 알아야개발할때 막히지 않고, 이해도 더 빠르게 되지 않을까 싶어서 정리를 해보았다.
이번 사이드 프로젝트를 개인적으로 진행하면서도, SpringSecurity Filter에 대한 처리와 UsernamePasswordToken 처리를 가장 많이 헷갈려했다. Filter의 순서라던가, Token의 처리..
Swagger UI를 사용해서 데이터가 송수신되는것만 확인하면 편하겠지만, 부트스트랩을 활용하여서 프론트도 같이 개발을 진행하고 있기 때문에 더욱더 생각이 많아졌던것같다.
이 이후에는 조금더 깊은 내용으로 Spring Security 흐름을 파악하고자 한다.
[Spring Security] 인증(Authentication), 인가(Authorization), 권한(Authority), 역할(Role) 알아보기
'BE > Java' 카테고리의 다른 글
[Spring] 트랜잭션 전파 ( Transaction Porpagation ) (1) | 2024.10.06 |
---|---|
JPA Mapping - JPA 연관관계 매핑에 대해서 알아보자 (0) | 2023.07.29 |
JPA Proxy 에 대해서 알아보자 (0) | 2023.07.26 |
JPQL ( Java Persistence Query Language ) - JPQL에 대해서 알아보자 (0) | 2023.07.23 |
JPA (Java Persistence API) - JPA에 대해서 알아보자 (0) | 2023.07.23 |