개발을 막 시작했을 무렵(1년?)부터, Spring Security를 처음부터 설정해본게 한 3~4번은 되는 것 같은데,
Security에 대한 구조를 부분 부분만 이해하고 있는 것 같아서 정리 하기위해 적습니다.
Filter는 이 글에서 다루지 않겠습니다. 길이 너무 길어지기도 하고, 내용도 꽤나 많기 때문에...
Spring Security에서의 용어를 확실하게 알고 이해하면 더 쉽기 때문에 먼저 용어정리를 합니다.
Spring Security에서 사용되는 용어
접근주체 (Principal)
- 보호받는 리소스에 접근하는 대상
- ex) 로그인 아이디
비밀번호 (Credential)
- 인증을 위한 비밀번호
- ex) 로그인 패스워드
권한 (Authority)
- 해당 사용자가 자원에 접근 가능한지 판단할 때 사용된다.
인증 (Authentication)
- 해당 사용자가 본인이 맞는지 확인하는 절차
- ex) 로그인, 패스워드를 입력하면 인증 절차를 거친 후 로그인 처리
인가 (Authorization)
- 해당 사용자가 요청한 자원에 접근할 권한이 있는지 확인하는 절차
- ex) 사용자가 가지고있는 권한(Authority)로 자원에 접근할 수 있는지 확인
Spring Security 인증 흐름
Spring Security에 대해 검색하게되면 항상 보게되는 그림 입니다. (지겨워요..매 번보는데도 또 새로워요..🤣)
- 유저가 Http Request를 하게되면 AuthencticationFilter에 걸립니다.
- AuthenticationFilter에서는 접근주체와 비밀번호를 UsernamePasswordAuthenticationToken에 넘겨주어 Authentication 객체로 만듭니다.
- 만들어진 Authentication 객체를 AuthenticationManager에 넘겨 줍니다.
- AuthenticationManager는 AuthenticationProvider를 호출하여 넘어온 인증(Authentication)을 처리하게 합니다.
- AuthenticationProvider는 UserDetailService를 이용하여 DB에서 인증주체를 불러와 인증처리한 다음, 이를 반환 합니다.
- AuthenticationManager는 인증 된 객체(Authentication)을 AuthenticationFilter로 넘겨줍니다.
- AuthenticationFilter는 이를 Security Context에 등록하게 됩니다.
Security Context Holder
Secuirty Context Holder는 인증한 객체를 가지고 있습니다.
Security Context 객체를 저장하고 감싸고 있는 wrapper 클래스 입니다.
Security Context 객체를 3가지 저장 방식에 따라 저장 합니다.
- MODE_THREADLOCAL: 스레드당 SecurityContext객체를 할당. default
- MODE_INHERITABLETHREADLOCAL: 메인 스레드와 자식 스레드에 관하여 동일한 SecurityContext를 유지
- MODE_GLOBAL: 응용 프로그램에서 단 하나의 SecurityContext를 저장한다.
Security Context는 우리가 인증한 객체인 Authentication 객체를 가지고 있습니다.
인증이 완료되면 Session에 저장되기 때문에 어플리케이션 어디서든 가져올 수 있습니다.
Security Context의 생성, 저장은 어느 부분에서 이루어질까요?
1. 인증하지 않았을 때 (익명 사용자)
AnonymousAuthenticationFilter에서 AnonymousAuthenticationToken을 Secuirty Context에 저장합니다.
2. 인증 시
UsernamePasswordAuthenticationToken을 Security Context에 저장합니다.
인증이 완료되면 Session에 SecurityContext를 저장합니다.
3. 인증 후
Session에서 SecurityContext를 꺼내와서 SecurityContextHolder에 저장합니다.
각 상황 별로 이루어 집니다.
이것으로 Spring Security에 대한 기본적인 용어 및 인증흐름, SecurityContextHolder에 대해 알아 보았습니다~