접근 주체(Principal) : 보호된 리소스에 접근하는 대상
인증(Authentication) : 보호된 리소스에 접근한 대상에 대해 이 유저가 누구인지, 애플리케이션의 작업을 수행해도 되는 주체인지 확인하는 과정(ex. Form 기반 Login)
인가(Authorize) : 해당 리소스에 대해 접근 가능한 권한을 가지고 있는지 확인하는 과정(After Authentication, 인증 이후)
권한 :인증된 주체가 애플리케이션의 동작을 수행할 수 있도록 허락되있는지를 판단.
어떠한 리소스에 대한 접근 제한, 모든 리소스는 접근 제어 권한이 걸려있다. 즉, 인가 과정에서 해당 리소스에 대한 제한된 최소한의 권한을 가졌는지 확인한다.
스프링 기반의 애플리케이션의 보안(인증과 권한,인가 등)을 담당하는 스프링 하위 프레임워크 이다.보안과 관련해서 체계적으로 많은 옵션을 제공해주기 때문에 개발자 입장에서는 일일이 보안관련 로직을 작성하지 않아도 된다.
[세션고정]
사용자의 세션 ID라고도 하는 세션 식별자에 영향을 준 다음 이를 사용하여 계정에 액세스할 수 있게 하는 것[클릭재킹]
웹 사용자가 자신이 클릭하고 있다고 인지하는 것과 다른 어떤 것을 클릭하게 속이는 악의적인 기법[서블릿]
클라이언트가 어떠한 요청을 하며 그에 대한 결과를 다시 전송해주는 역할을 하는 자바 프로그램

이제 요청이 들어오면 인증을 담당하는 필터(AuthenticationFilter)를 거친다
AuthenticationFilter는 사용자의 세션 ID(JSESSIONID)가 Security Context에 있는지 확인한다.
Security Context에 세션 ID가 없다면 아래 로직을 수행한다.
[Security Context]:
아래의 모든 로직을 통과한 인증된 사용자의 정보(인증 개체)를 저장하는 공간
1. 사용자가 로그인 정보를 입력하고 인증 요청을 보냄(http request)
2. AuthenticationFilter에서 UsernamePasswordAuthenticationToken을 생성
3. AuthenticationFilter에게 인증용 객체(UsernamePasswordAuthenticationToken)을 AuthenticaionManager 에게 전달.
(Manager는 등록된 AuthenticationProvider를 통해 사용자 정보를 조회)
4. 실제 인증을 할 AuthenticationProvider에게 Authentication객체(UsernamePasswordAuthenticationToken)을 다시 전달한다.
5. DB에서 사용자 인증 정보를 가져올 UserDetailsService 객체에게 사용자 아이디를 넘겨주고 DB에서 인증에 사용할 사용자 정보(사용자 아이디, 암호화된 패스워드, 권한 등)를 UserDetails(인증용 객체와 도메인 객체를 분리하지 않기 위해서 실제 사용되는 도메인 객체에 UserDetails를 상속하기도 한다.)라는 객체로 전달 받는다.
6. AuthenticationProvider는 UserDetails 객체를 전달 받은 이후 실제 사용자의 입력정보와 UserDetails 객체를 가지고 인증을 시도한다.
7.UserDetailsService는 DB에 저장된 회원의 비밀번호와 비교해 일치하면 UserDetails 인터페이스를 구현한 객체를 반환한다.
8. AuthenticationProvider 인터페이스에 의해 사용자가 성공적으로 인증되면, 완전히 채워진 인증개체가 반환된다.
9. AuthenticationManager는 획득한 완전히 채워진 인증개체를 관련 인증 필터(AuthenticationFilter)로 다시 반환한다
10. 인증이 완료되면 사용자 정보를 가진 Authentication 객체를 SecurityContextHolder(spring security의 인메모리 세션저장소)에 담은 이후 성공시AuthenticationSuccessHandle를 실행한다.(실패시 AuthenticationFailureHandler를 실행한다.)**
[AuthenticationFilter]:
인증을 담당하는 필터[UsernamePasswordAuthenticationToken]:
사용자 자격 증명(credentials)을 기반으로 만들어진 인증개체[AuthenticationProvider]:
제공된 인증 개체로 사용자를 인증.
[UserDetailsService]:
DB에 저장된 회원의 비밀번호와 비교함[AuthenticationSuccessHandle, AuthenticationFailureHandler]
로그인 성공, 실패시 실행되는 객체(클래스)

1. 필터(Filter)
스프링 시큐리티는 서블릿의 필터를 기반으로 동작.
2. DelegatingFilterProxy
사용자의 요청이 서블릿에 전달되어 자원에 접근하기 전에, 스프링 시큐리티는 필터의 생명주기를 이용해서 인증과 권한 작업을 수행.
3. FilterChainProxy
FilterChainProxy는 DelegatingFilterProxy를 통해 받은 요청과 응답을 스프링 시큐리티 필터 체인에 전달하고 작업을 위임하는 역할.
4.SecurityFilterChain
SecurityFilterChain은 인증을 처리하는 여러 개의 시큐리티 필터를 담는 필터 체인입니다. 또, 필터체인 프록시를 통해 서블릿 필터와 연결되고 어떤 시큐리티 필터를 통해 인증을 수행할지 결정하는 역할.
5. Security Filters
시큐리티 필터는 요청을 스프링 시큐리티 매커니즘에 따라 처리하는 필터입니다.
앞에서 본 DelegatingFilterProxy와 FilterChainProxy가 서블릿과 스프링과의 연결을 담당했다면, Security Filter는 시큐리티의 핵심 기능을 수행하는 지점
[Spring Security] 스프링 시큐리티 아키텍처
Spring security - 용어 정리/작동 방식/JWT
Spring boot - Spring Security(스프링 시큐리티) 란? 완전 해결!
[JSP] 서블릿(Servlet)이란?
[Spring Security] Spring Security의 개념과 동작 과정
Spring Security 5.5.3