코드 그라데이션
[사전 지식] 스프링 시큐리티 본문
스프링 시큐리티
- 스프링 기반의 애플리케이션 보안(인증,인가,권한)을 담당하는 스프링 하위 프레임워크.
- 스프링 시큐리티를 이해하려면 인증과 인가에 대한 개념을 알아야 한다.
인증과 인가
인증
- 인증(authentication)은 사용자의 신원을 입증하는 과정.
- 예를 들어 사용자가 사이트에 로그인을 할 때 누구인지 확인하는 과정.
- 인가(authchzation)와는 다르다
인가
- 인가는 사이트의 특정 부분에 접근할 수 있는지에 권한을 확인하는 작업.
- 예를 들어 관리자는 관리자 페이지에 들어갈 수 있지만 일반 사용자는 관리자 페이지에 들어갈 수 없는 것.
- 이런 권한을 확인하는 과정을 인가라고 한다.
스프링 시큐리티
- 스프링 시큐리티는 스프링 기반 애플리케이션의 보안을 담당하는 스프링 하위 프레임워크. 보안 관련 옵션을
많이 제공한다. - 그리고 애너테이션으로 설정도 매우 쉽다.
- CSRF 공격, 세션 고정(session fixation) 공격을 방어해주고, 요청 헤더도 보안 처리를 해주므로 개발자가 보안 관련 개
발을 해야 하는 부담을 크게 줄여준다.
CSRF 공격
- 사용자의 권한을 가지고 특정 동작을 수행하도록 유도하는 공격
세션 고정 공격
- 사용자의 인증 정보를 탈취하거나 변조하는 공격
스프링 시큐리티는 필터 기반으로 동작한다!
필터 기반으로 동작하는 스프링 시큐리티
<그림>
- SecurityContextPersistenceFilter부터 시작해서 아래로 내려가며 FilterSecuritylnterceptor 까지 순서대로 필터를 거친다.
- 필터를 실행할 때는 녹색 화살표로 연결된 오른쪽 박스의 클래스를 거치며 실행한다.
- 원하는 때에는 특정 필터를 제거하거나 필터 뒤에 커스텀 필터를 넣는 등의 설정도 가능하다.
여기서 눈여겨볼 필터는 회색으로 색칠한 UsernamePasswordAuthenticationFilter와 FilterSecuritylnterceptor.
- UsernamePasswordAuthenticationFilter는 아이디와 패스워드가 넘어오면 인증 요청을 위임하는 인증 관리자 역할.
- FilterSecuritylnterceptor는 권한 부여 처리를 위임해 접근 제어 결정을 쉽게 하는 접근 결정 관리자 역할.
[표로 정리]
필터 이름 | 설명 |
SecurityContextPersistenceFilter | SecurityContextRepository에서 SecurityContext(접근 주체와 인증에 대한 정보를 담고 있는 객체)를 가져오거나 저장하는 역할. |
LogoutFilter | 설정된 로그아웃 URL로 오는 요청을 확인해 해당 사용자를 로그아웃 처리 |
UsernamePassword AuthenticationFilter |
인증 관리자이다. 폼 기반 로그인을 할 때 사용되는 필터로 아이디,패스워드 데이터를 파싱해 인증 요청을 위임한다. - 인증이 성공하면 AuthenticationSuccessHandler를 - 실패하면 AuthenticationFailureHandler를 실행 |
DefaultLoginPageGenarating Filter |
사용자가 로그인 페이지를 따로 지정하지 않았을 때 기본으로 설정하는 로그인 페이지 관련 필터 |
BasicAuthenticationFilter | 요청 헤더에 있는 아이디와 패스워드를 파싱해서 인증 요청을 위임한다. - 인증이 성공하면 AuthenticationSuccessHandler를 - 인증에 실패하면 AuthenticationFailureHandler를 실행. |
RequestCacheAwareFilter | 로그인 성공 후, 관련 있는 캐시 요청이 있는지 확인하고 캐시 요청을 처리해준다. - 예를 들어 로그인하지 않은 상태로 방문했던 페이지를 기억해 두었다가 로그인 이후에 그 페이지로 이동시켜준다. |
SecurityContextHolderAware RequestFilter |
HttpServletRequest 정보를 감싼다. 필터 체인 상의 다음 필터들에게 부가 정보를 제공하기 위해 사용한다. |
AnonymousAuthenticationFilter | 필터가 호출되는 시점까지 인증되지 않았다면 익명 사용자 전용 객체인 Anonymous Authentication 을 만들어 SecurityContext 에 넣어준다. |
SessionManagementFilter | 인증된 사용자와 관련된 세션 관련 작업을 진행한다. - 세션 변조 방지 전략올 설정하고, 유효하지 않은 세션에 대한 처리를 하고, 세션 생성 전략을 세우는 등의 작업을 처리한다. |
ExceptionTranslationFilter | 요청을 처리하는 중에 발생할 수 있는 예외를 위임하거나 전달한다. |
FilterSecurityInterceptor | 접근 결정 관리자이다. AccessDecisionManager로 권한 부여 처리를 위임함으로써 접근 제어 결정을 쉽게 한다. 이 과정에서는 이미 사용자가 인증되어 있으므로 유효한 사용자인지도 알 수 있다. 즉, 인가 관련 설정할 수 있습니다. |
[그림]
➊ 사용자가 폼에 아이디와 패스워드를 입력하면,HTTPServletRequest에 아이디와 비밀번호 정보가 전달된다.
이 때, AuthenticationFilter가 넘어온 아이디와 비밀번호의 유효성 검사를 수행한다.
➋ 유효성 검사가 끝나면 실제 구현체인 UsernamePasswordAuthenticationToken을 만들어 넘겨준다.
➌ 전달받은 인증용 객체인 UsernamePasswordAuthenticationToken을 AuthenticationManager에게 보낸다.
➍ UsernamePasswordAuthenticationToken을 AuthenticationProvider에 보낸다.
➎ 사용자 아이디를 UserDetailService에 보낸다.
UserDetailService는 시용자 아이디로 찾은 사용자의 정보를 UserDetails 객체로 만들어 AuthenticationProvider에게 전달한다.
➏ DB에 있는 사용자 정보를 가져온다
➐ 입력 정보와 UserDetails의 정보를 비교해 실제 인증 처리를 수행한다.
➑ ~ ➓ 까지 인증이 완료되면 SecurityContextHolder에 Authentication를 저장한다.
- 인증 성공 여부에 따라 성공하면 AuthenticationSuccessHandler,
- 실패하면 AuthenticationFailureHandler 핸들러를 실행한다.
'SpringBoot [예제] 블로그 만들기 > 시큐리티, JWT 입히기' 카테고리의 다른 글
JWT 서비스 구현하기 (1) | 2023.10.19 |
---|---|
JWT 소개 (0) | 2023.10.18 |
[사전 지식] 토큰 기반 인증 (0) | 2023.10.18 |
시큐리티 설정, 로그인/로그아웃, 회원가입 구현 (0) | 2023.10.17 |
회원 도메인 만들기 (1) | 2023.10.17 |