Spring Security란?
Spring 기반의 애플리케이션의 보안을 담당하는 스프링 하위 프레임워크
Spring 기반 애플리케이션의 보안에서는 사실상의 표준
보안의 3요소
1. 접근 주체(Principal) : 보호된 대상에 접근하는 사용자
2. 인증(Authenticate) : 현재 사용자가 누군인지 확인하는 과정, 일반적으로 아이디/암호를 이용해 인증 처리
3. 인가(Authorize) : 현재 사용자가 특정 URL, 기능 등의 접근 권한 여부 검사
1) 인증과 인가
Spring Security는 크게 인증 -> 인가 절차로 진행한다.
이러한 인증과 인가를 위해 Principal _(보호된 대상에 접근하는 사용자)_을 ID로, Credential _(대상에 접근하는 사용자의 비밀번호)_을 비밀번호로 사용하는Credential 기반의 인증 방식을 사용한다.
인증의 종류
1. Credential(자격) 기반 인증: 웹 대부분의 인증 방식은 Credential 기반.
권한을 부여받는데 1차례의 인증과정이 필요
대개 사용자명과 비밀번호를 입력받아 입력한 비밀번호가 저장된 비밀번호와 일치하는지 확인.
2, Two-factor authentication(이중 인증): 한번에 2가지 방식으로 인증을 받는 것.
예를 들어 금융, 은행 웹 어플리케이션 이용 시, 로그인과 인증서 2가지 방법으로 인증을 받는 경우.
3. 물리적인 인증 : 웹의 영역을 벗어난 것이지만 가장 효과적인 보안 수단 중에 하나.
예를 들어 컴퓨터를 킬 때 지문을 인식받는다거나 키를 삽입해야 하는 경우
인가의 과정
1. Granted Autority(부여된 권한) : 회원가입 등을 통해 반영구적인 권한이 부여됐다면
이 회원에게 부여된 권한을 어딘가에 저장해야 함.
2. Intercept(리소스 권한) : 적절한 권한을 가진자만 해당 자원에 접근할 수 있도록
자원의 외부요청을 원천적으로 Intercept
2) 인증과정

[자세한 과정]
| 1 | 사용자가 form을 통해 로그인 정보가 담긴 Request를 보내면, AuthenticationFilter가 HttpServletRequest에서 사용자가 보낸 ID/PW를 인터셉트 |
| 2 | HttpServletRequest에서 꺼내온 ID/PW를 인증용 객체(UsernamePasswordAuthenticationToken)로 만들어 전달 |
| 3 | 진짜 인증을 담당하는 AuthenticationManager(구현체 - ProviderManager)에게 Authentication객체 (UsernamePasswordAuthenticationToken)을 전달 |
| 4 | 인증 절차가 시작되면 AuthenticationProvider 인터페이스 실행 (DB와 ID/PW를 비교) 이 때, authenticate() 메소드를 오버라이딩 하게 되는데 이 메소드의 파라미터인 Authentication으로 화면에서 입력한 로그인 정보를 가져올 수 있다. |
| 5~7 | UserDetailsService 인터페이스는 로그인 정보를 토대로 메소드를 호출하여 DB에 있는 이용자의 정보를 UserDetails형으로 가져온다. |
| 8~9 | 쭉 반환 시켜준다. |
| 10 | 인증이 완료되면 사용자 정보를 가진 Authentication 객체를 SecurityContextHolder에 담아 AuthenticationSuccessHandler (성공) or AuthenticationFailureHandler(실패)를 실행 |

3) Spring Security Filter
spring Security는 다음과 같이 여러 필터들이 서로 연결되어 인증/인가를 처리한다.
이를 chain과 같이 엮어져있다고 하여 Spring Security Filter Chain이라고 부른다.

| SecurityContext PersistenceFilter |
Request전에, SecurityContextRepository에서 받아온 정보를 SecurityContextHolder에 주입 |
| LogoutFilter | 로그아웃 URL에 대한 요청을 감시하여 사용자를 로그아웃시킴 |
| UsernamePassword AuthenticationFilter |
폼기반 인증에 사용하는 URL요청을 감시하여 사용자의 인증 진행 |
| DefaultLoginPage GeneratingFilter |
사용자가 별도의 로그인 페이지를 구현하지 않은 경우, 스프링에서 기본적으로 설정한 로그인 페이지를 처리 |
| BasicAuthenticationFilter | HTTP 기본 인증 헤더를 감시하고 결과를 SecurityContextHolder에 저장 |
| Anonymous AuthenticationFilter |
SecurityContextHolder에 인증(Authentication) 객체가 있는지 확인하고, 필요한 경우 Authentication 객체를 주입 |
| SessionManagementFilter | 요청이 시작된 이 후 인증된 사용자 인지 확인하고, 인증된 사용자일 경우, SessionAuthenticationStrategy를 호출하여 세션 고정 보호 메커니즘을 활성화하거나 여러 동시 로그인을 확인하는 것과 같은 세션 관련 활동을 수행 |
| ExceptionTranslationFilter | 필터 체인 내에서 발생(Throw)되는 모든 예외(AccessDeniedException, AuthenticationException)를 처리합니다. |
| FilterSecurityInterceptor | 이 필터는 권한부여와 관련한 결정을 AccessDecisionManager에게 위임해 권한부여 결정 및 접근 제어 결정을 쉽게 만들어 줌 |
출처: https://devuna.tistory.com/55 / siyoon210.tistory.com/32
공부 진행 중
'Spring > 웹' 카테고리의 다른 글
| Container란? (Servlet / Spring Container) (0) | 2021.04.03 |
|---|---|
| Lombok의 좋은 사용법 (3) | 2021.03.29 |
| AOP란? (Spring AOP) (0) | 2021.03.26 |
| Web Server vs Web Application Server (0) | 2021.01.24 |
| Spring MVC 패턴을 이용한 Java 웹크롤러 (0) | 2020.06.20 |