1.http요청이 오면 authenticationFilter가 요청을 토대로 usernamePasswordAuthenticationTocken을 생성
2.authenticationmanager의 구현체(ProviderManager)가 이 usernamePasswordAuthenticationTocken을 Filter로부터 받아
authenticationProvider에게 전달.
3.authenticationProvider는 이 Tocken을 통해 UserDetailService에서 그에 맞는 사용자 정보가 담긴 Authentication객체를 넘겨받음.
4.최초의 Filter에까지 Authentication객체가 넘어가면 이것이 SecurityContext에 저장됨.
-하지만 위의 흐름외에도 다양한 방식으로 필터체인을 커스터마이징 할 수 있음.
로그인을 한 후 사용자 정보를 유지하는 전통적인 방법은 세션이었다.
http는 stateless하기 때문에 사용자의 정보가 유지되기 위해서는 별도의 방법이 필요하다. 이때, 우선은 브라우저에서 쿠키를 만들어 여기에 정보를 담을 수 있다.
하지만 이 쿠키는 보안상 취약,용량의 제한, 네트워크에 대한 부하등의 단점이 있어 보완이 필요하다.
이 보완법이 세션을 이용하는 것이다. 세션은 클라이언트의 인증정보를 쿠키가 아닌 서버에 저장하고 관리하는 방법이다. 클라이언트의 식별자인JSESSIONID(세션ID)를 쿠키에 저장하고 클라이언트가 요청과 JSESSIONID를 함께 보내면 서버가 이 식별자의 유효성을 판단해 세션으로부터 사용자정보를 전달한다.
하지만 이 방법은 세션이 서버에 쌓이며 부하를 일으킬 수 있다.
때문에 세션방식과 다른 방법인 jwt가 사용된다.
jwt는 클라이언트 정보를 암호화,압축 시켜 tocken으로 만든 뒤 클라이언트와 서버가 주고받는 방법이다.
클라이언트의 로그인 요청이 들어오면 서버는 검증 후 클라이언트의 정보를 payload에 담아 암호화해 JWT를 발급한다. 클라이언트는 이 jwt를 저장해두고 서버에 요청시마다 함께보내며 서버는 이 JWT를 복호화해 변조여부, 클라이어트의 정보 확인을 해 응답한다.
이 방식은 세션방식과 다르게 정보를 별도의 공간에 저장하지 않아 서버과부하가 적고, 확장성이 좋다. 하지만 JWT의 길이가 길어 네트워크에 부하가 상대적으로 크고 토큰 탈취의 위험 떄문에 refresh tocken등의 보안전략이 필요하다.
jwt는
header: 어떤 알고리즘으로 암호화 했나
payload: 정보들 저장
signatur: 서명, 위의 정보들을 암호화한 결과
로 이뤄져 있다.
http://yoonbumtae.com/?p=3000
https://brunch.co.kr/@springboot/491
https://tecoble.techcourse.co.kr/post/2021-07-10-understanding-oauth/
https://imbf.github.io/spring/2020/06/29/Spring-Security-with-JWT.html
https://webfirewood.tistory.com/115
https://www.callicoder.com/spring-boot-security-oauth2-social-login-part-3/