안녕하세요 놀이방 사장입니다
이번 포스팅은 스프링부트3
스프링 시큐리티 프레임워크를 알아보겠습니다.
스프링 시큐리티란?
스프링 기반의 애플리케이션 보안(인증, 인가, 권한) 을 담당하는 스프링 하위 프레임워크이다.
먼저 인증과 인가에 개념에 대해 알아보자
1. 인증
사용자의 신원을 입증하는 과정이다.
ex) 사용자가 사이트에 로그인 할 때 누구인지 확인하는 과정을 인증이라고 한다.
2. 인가
사이트 특정 부분에 접근할 수 있는 지 권한을 확인하는 작업이다.
EX) 관리자는 관리자 페이지를 들어 갈 수 있지만 일반 사용자는 관리자 페이지에 들어갈 수 없다.
이러한 과정을 인가라고 한다.
인증과 인가를 도구없이 구현할려면 굉장히 많은 시간이 걸리나 스프링 시큐리티를 사용하면 쉽게 구현할 수 있다.
스프링 시큐리티는 보안 관련 옵션을 많이 제공한다.
애너테이션으로 설정도 매우 쉽고 CSRF공격, 세션 고정 공격을 방어해주고 , 요청 헤더도 보안 처리 해주므로 개발자가 보안 관련 개발 부담을 줄여준다.
1. CSRF공격
사용자 권한을 가지고 특정 동작을 수행하도록 유도하는 공격
2. 세션 고정
사용자의 인증 정보를 탈취하거나 변조하는 공격을 말한다.
필터기반의 스프링 시큐리티
스프링 시큐리티는 필터기반으로 동작
이미지처럼 다양한 필터가 있다.
각 필터에서 인증,인가와 관련된 작업을 처리한다.
SecurityContextPersistenceFilter부터 시작해서 아래로 내려가며 FilterSecurityInterceptor까지 순서대로 내려간다.
필터를 실행할 때 옆에 빨간 화살표로 연결된 올느쪽 박스의 클래스를 거치면서 실행된다.
스프링 시큐리티 필터 역할
필터명 | 설명 |
SecurityContextPersistenceFilter | SecurityContextRepository에서 SecurityContext(접근 주체와 인증에 대한 정보를 담고 있는 객체)를 가져오거나 저장하는 역할 |
LogoutFilter | 설정된 로그아웃 URL로 오는 요청을 확인해 해당 사용자를 로그아웃 처리한다. |
UsernamePasswordAuthenticationFilter | 인증관리자이다. 폼 기반 로그인을 할 때 사용되는 필터로 아이디, 패스워드 데이터를 파싱해 인증 요청을 위임 인증이 성공하면 AuthenticationSucessHandler를 인증에 실패하면 AuthenticationFailureHandler를 실행한다. |
DefaultLoginPageGeneratingFilter | 사용자가 로그인 페이지를 따로 지정하지 않았을 때 기본으로 설정하는 로그인 페이지 관련 필터이다. |
BasicAuthenticationFilter | 요청헤더에 있는 아이디와 패스워드를 파싱해서 인증 요청을 위임한다. 인증이 성공하면 AuthenticationSucessHandler를 인증에 실패하면 AuthenticationFailureHandler를 실행한다. |
RequestCacheAwareFilter | 로그인 성공 후, 관련 있는 캐시 요청이 있는지 확인하고 캐시요청을 처리해준다. 예를 들어 로그인하지 않은 상태로 방문했던 페이지를 기억해두었다가 로그인 이후 그 페이지로 이동시켜준다. |
SecurityContextHolderAwareRequestFilter | HttpServletRequest 정보를 감싼다. 필터 체인 상의 다음 필터들에게 부가 정보를 제공되기 위해 사용 |
AnonymousAuthenticationFilter | 필터가 호출되는 시점까지 인증되지 않았다면 익명 사용자 전용 객체인 AnonymousAuthentication을 만들어 SecurityContext에 넣어준다. |
SessionManagementFilter | 인증된 사용자와 관련된 세션 관련 작업을 진행한다. 세션 변조 방지 전략을 설정하고, 유효하지 않은 세션에 대한 처리를 하고 세션 생성 전략을 세우는 등의 작업을 처리한다. |
ExceptionTranslationFilter | 요청을 처리하는 중에 발생할 수 있는 예외를 위임하거나 전달한다. |
FilterSecurityInterceptor | 접근 결정 관리자이다. AccessDecisionManager로 권한 부여 처리를 위임함으로써 접근 제어 결정을 쉽게 해준다. 이 과정에서 이미 사용자가 인증되어 있으므로 유효한 사용자인지도 알 수 있다. 즉, 인가 관련 설정을 할 수 있다. |
가장 많이 사용하는 아이디와 패스워드 기반 폼 로그인을 시도하면 스프링 시큐리티에서는 어떤 절차로 처리하는지 알아보자
1. 사용자가 폼에 아이디와 패스워드를 입력 HTTPServletRequest에 아이디와 패스워드 정보가 담긴다.
여기서 AuthenticationFilter가 넘어온 아이디와 비밀번호의 유효성을 검사한다.
2. 유효성 검사가 끝나면 실제 구현체인 UsernamePasswordAuthenticationToken을 만들어 넘겨준다.
3. 전달받은 인증용 객체 UsernamePasswordAuthenticationToken을 AuthenticationManger에 보내준다.
4. UsernamePasswordAuthenticationToken을 AuthenticationProvider에 보낸다.
5. 사용자 아이디를 UserDetailService에 보낸다.
UserDetailService는 사용자 아이디로 찾은 사용자의 정보를 UserDetails 객체로 만들어 AuthenticationProvider에 전달한다.
6. DB에 있는 사용자 정보를 가지고 온다.
7. 인증정보와 UserDetails의 정보를 비교해 실제 인증 처리를 한다.
8. AuthenticationManager -> AuthenticationFilter -> SecurityContextHolder 인증이 완료되면
SecurityContextHolder 에 Authentication을 저장한다.
인증 여부 성공여부에 따라
성공 - AuthenticationSuccessHandler
실패 - AuthenticationFailureHandler
를 실행한다.
이것이 스프링 시큐리티 폼 로그인의 인증 흐름이다.
이상으로 스프링부트3 사전지식 : 스프링시큐리티 포스팅을 마치겠습니다.
'웹 > Spring' 카테고리의 다른 글
스프링부트3 회원가입 로그인, 로그아웃 구현하기 - 로그인, 로그아웃 서비스 메서드 작성하기 (0) | 2023.10.24 |
---|---|
스프링부트3 회원가입 로그인, 로그아웃 구현하기 - 회원 도메인 만들기 (0) | 2023.10.23 |
스프링부트3 블로그 글 삭제 기능 추가하기 (0) | 2023.10.22 |
스프링부트3 블로그 글 상세보기 구현하기 (0) | 2023.10.21 |
스프링부트3 블로그 목록 뷰 구현하기 (0) | 2023.10.21 |