spring security 내부 흐름 과정
1단계
- 유저가 로그인 페이지에 본인의 자격증명을 입력 (브라우저 또는 모바일 애플리케이션의 도움을 받음)
- 유저는 본인의 자격 증명과 함께 요청을 백엔드 웹 애플리케이션에 전달. 이 과정에서 spring security의 도움을 받아 데이터를 보호받는다.
spring security filter
- 전달된 정보는 spring security filters에서 받게 된다. security filter는 백엔드 서버에 들어오는 모든 요청을 감시하는 역할을 한다. 동작 과정은 다음과 같다.
- 엔드유저가 접근하고자하는 경로 확인
- 애플리케이션에 구성해둔 경로와 설정에 따라 이 필터들은 보호된 자원인지, 공개적으로 접근가능한지 판별하게 된다.
- 결과에 따라 로그인 페이지를 표시하게 되고, 유저가 웹페이지에 접근하는 첫번째 시도에 발생된다.
2단계
- 엔드유저가 보내는 유저 네임과 비밀번호를 추출하고 2단계의 인증객체로 변환시킨다. 여기서 인증 객체란 spring security 내부에서 유저의 정보를 저장하기 위한 핵심 표준을 말한다. 2단계에서는 유저네임과 자격증명만 보유(저장)하게 된다.
3단계
- 객체가 형성되면 spring security filters는 이 요청을 AuthenticationManager에게 전달한다.
4단계
AuthenticationManager
- Authentication Manager가 하는 일은 어떤 인증 제공자가 있는지 확인한다.
- 특정 요청에 대해 유효한 AuthenticationProviders가 어떤 것인지 확인하는 것이 인증 관리자(AuthenticationManager)의 책임이다.
5단계
AuthenticationProviders
- 실질적인 인증 로직을 정의하는 역할을 한다.
- 실질적인 로직을 직접 작성하거나 UserDetails Manager/Service 라는 인터페이스와 클래스를 활용할 수 있다.
UserDetailsManager / UserDetailsService
- 어떤 인증을 수행할 때 DB같은 저장소에서 유저정보를 불러온다.
- 불러온다음 엔드유저가 제공한 정보와 저장소안의 정보를 비교한다.
7,8단계
- Authentication providers를 통해 로직을 처리하고, spring security filter로 돌아온다.
9단계
- spring security filters는 과정 2에서 생성한 인증 객체를 security context에 저장한다. (인증이 성공적이였는지, 아닌지 / 세션 ID가 무엇인지 등)
10단계
- 엔드 유저에게 결과를 반환한다.
두번째부터는 인증이 성공적이라면, 유저가 이미 로그인했는지 아닌지 기존 session ID, token 등을 활용해서 로그인을 했는지 아닌지 체크한다.
강의와 공식 문서, 디버깅을 통해 Spring security의 내부 흐름을 어느정도 이해할 수 있었다. 다음은 Spring Security 내부 코드를 파헤치면서 각 단계에서 수행되는 자세한 과정을 알아보겠다.
참고
https://spring.io/projects/spring-security
https://www.udemy.com/course/spring-security-6-jwt-oauth2-korean/