오늘은 공식 문서를 보는 걸로 시작해서 강의를 한 두 개 정도 보는 걸로 마무리했습니다. 원론적인 조망 설명이 공식 문서가 엄청 잘 되어있거든요. 강의자료에는 생략되었거나 헷갈리는 부분이 좀 있죠...
Authentication 아키텍처
네가 누구인지 확인하겠다, "인증" 이 어떻게 처리되는지 구조를 조망해봅시다.
문서와 강의를 둘 다 참고해서 정리하고 있습니다.
https://docs.spring.io/spring-security/reference/servlet/authentication/architecture.html
Authentication 의 키 플레이어: 인증처리필터, 인증제공자, 인증값
제 생각에 인증의 키 플레이어는 둘이고, 주요 데이터는 하나입니다.
- [데이터] Authentication: 사용자 인증 정보 데이터
- [로직] Auth(생략)Provider: 특정 종류의 인증정보를 제공해줍니다.
- [로직] Auth(생략)ProcessingFilter: 특정한 방식의 인증 절차를 수행합니다.
이제 각각을 알아보면 앞선 강의들도 대략 커버가 될 겁니다.
[데이터] Authentication: 사용자 인증 정보 데이터
Authentication 은 현재 인증된 사용자의 정보 데이터입니다.
- 인증은 되었는지, 권한에는 뭐가 있는지, 메타정보는 뭐가 있는지 같은 정보도 들어있습니다.
- interface Authentication 을 상속하고, 보통 클래스 이름 끝에 Token 이 붙어있습니다.
- ThreadLocal 이라는 스레드 저장소에, 즉, 거기에 있는 SecurityContextHolder 라는 클래스에 임시로 저장해놓습니다. 인증 처리가 끝나면 지워진다고 생각하면 됩니다. (맞겠지...?)
- 스레드 저장소에 저장되므로 별도로 주입받지 않아도 같은 스레드라면 마치 싱글턴처럼 아무곳에서나 받아올 수 있습니다. (왜 이런 짓을...? 설마 그 곳에 쓰기 편한 싱글턴이 있으니까...?)
- 그래서 강의 초반에 확인용으로 /auth 경로에 SecurityContextHolder 에서 현재 Auth 를 가져와서 뿌려주는 걸 만들었었습니다. 이후에도 계속 쓰이므로 이게 뭔지 알아두면 유용하겠죠.
Authenticaiton 에는 중요한 인증 정보들이 들어있습니다.
- Principal: 너 누구야? (principal 의 뜻 중에는 "주체" 라는 뜻도 있습니다.)
- Credentials: 암호
(로그인 시나리오에서만 채워집니다. 사용자가 암호를 입력한 게 아니라 이미 로그인이 되어있고 인증정보를 확인하기 위해서만 interface Authenticaiton 이 사용되는 상황이라면 이건 비어있겠죠.) - Authorities: 권한들입니다. interface GrantedAuthority 들입니다. 권한을 다룰 때 사용합니다.
[로직] Auth(생략)Provider: 특정 종류의 인증정보를 제공해줍니다.
Auth(생략)Provider는 특정 종류의 인증정보를 제공해줍니다.
- 입력도 출력도 Authentication (사용자 인증 정보) 입니다.
- 예를 들자면,
입력으로 UsernamePasswordAuthenticationToken 을 받아서
출력으로 내가 직접 만든 StudentAuthenticationToken 을 반환해줄 수 있습니다.
도장을 찍어주는 셈이죠.
- 예를 들자면,
- interface AuthenticationProvider 를 상속합니다.
Auth(생략)Provider 는 interface Auth(생략)Manager 에서 관리합니다. 그리고 얘내들은 종속 관계로 만들거나 하는 체이닝도 돼요. 자식이 실패했다, 그럼 부모한테 맡기는 거죠. 아 참, 이 인터페이스의 대다수의 구현은 ProviderManager 입니다.
그래서 아래에 나올 Auth(생략)ProcessingFilter 는 Auth(생략)Provider가 아니라, 이걸 관리하고 있는 Auth(생략)Manager 를 호출합니다. 매니저의 추가 및 삭제는 SecurityConfig에서.
[로직] Auth(생략)ProcessingFilter: 특정한 방식의 인증 절차를 수행합니다.
이게 바로 인증의 엔트리 포인트입니다. 특정한 방식의 인증에 대한 절차를 단계별로 수행하는 역할을 합니다.
- Spring Security 의 Security Filter 입니다. 이전에 정리했던 전체 구조에서는 어디에 위치하냐면요... 그림을 보시면 되겠습니다.
- 모든? 대다수의? 클래스가 abstract class AbstractAuthenticationProcessingFilter 을 상속합니다. 그래서 절차가 판박이입니다.
다른 필터들을 보면 똑같이 생긴 구조에 이름이랑 구성요소만 바뀌어있다는 걸 확인하실 수 있습니다.
- 초기값으로 사용할 Authentication 을 만듭니다. 사용자가 로그인한다고 ID 와 암호를 넣었다면 그거에서 만들어내겠죠?
- 각 인증방법마다(하위클래스겠죠?) 만들어내는 인증 정보 "interface Authentication"의 클래스는 다 다릅니다. 가령, UsernamePasswordAuth(생략)Proc(생략)Filter 에서는 UsernamePasswordAuthenticationToken을 만들겁니다.
- 초기 인증정보가 만들어졌으니, 이걸 지지고 볶으라고 AuthenticationProvider 들한테 넘겨줍니다. 아, 이건 매니저가 관리하고 있었죠? Provider를 직접 호출하지는 않고 AuthenticationManager (보통 ProviderManager) 에 대신 지지고 볶아달라고 위임합니다.
- 이제 Auth(생략)Proc(생략)Filter 의 손에는 지지고 볶아진 최종 인증 정보 interface Authentication 이 있을겁니다. 여기에다 대고 성공했는지 물어보고, 거기에 따라 다른 절차를 수행합니다. 밑에 서비스랑 핸들러들 보이시죠?
- 초기값으로 사용할 Authentication 을 만듭니다. 사용자가 로그인한다고 ID 와 암호를 넣었다면 그거에서 만들어내겠죠?
UsernamePasswordAuthenticationFilter 를 보세요. 위에랑 똑같이 생겼고 구성요소만 다르죠?
강의에서 본 내용
이렇게 개념들을 정리한 뒤에 강의를 다시 보면 감회가 새롭습니다.
특히 이번에 새로 본 강의 동영상인 "04. Authentication 메커니즘" 에서는 UsernamePasswordAuthenticationToken 을 받아서 커스텀으로 만든 StudentAuth(생략)Token 과 TeacherAuth(생략)Token 을 반환하는 StudendAuth(생략)Provider, TeacherAuth(생략)Provider 를 만들어서 실제로 이게 어떻게 돌아가는지 보여줍니다.
아 그리고... 이 그림은... 좀 그랬어요... 그림은 무엇을 나타내려는지가 명확해야 하고 기존 기호들이랑 헷갈리지 않게 그려야 하는데 의문의 동그라미를 가리키는 상속선은 구조를 이해하고 있지 않다면 그림만 봤을 때 오해하기에 딱 좋습니다.
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
패스트캠퍼스: https://bit.ly/37BpXiC
#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #한번에끝내는JavaSpring웹개발마스터초격차패키지Online
시큐리티는 강의만 따라가서는 이해하기가 몹시 어려울 것 같아서 따로 찾아보는 것도 병행해야 할 것 같습니다. 오늘은 실습을 해보진 못했지만 언제 실습도 꼭 해봐야겠네요.
'FastCampus - 한번에 끝내는 Java|Spring 웹 개발 > 04-2 시큐리티' 카테고리의 다른 글
Security 02-06: DB에 계정 넣기 - 패스트캠퍼스 챌린지 50일차 (0) | 2022.03.14 |
---|---|
Security 02-05: Basic Auth (2) - 패스트캠퍼스 챌린지 49일차 (0) | 2022.03.13 |
Security 02-05: Basic Auth - 패스트캠퍼스 챌린지 48일차 (0) | 2022.03.12 |
Security 02: 전체 구조 - 패스트캠퍼스 챌린지 46일차 (0) | 2022.03.10 |
Security 01: 개요 및 맛보기 - 패스트캠퍼스 챌린지 42일차 (0) | 2022.03.06 |