본문 바로가기

FastCampus - 한번에 끝내는 Java|Spring 웹 개발/04-2 시큐리티

Security 02-04: Authentication 메커니즘 - 패스트캠퍼스 챌린지 47일차

오늘은 공식 문서를 보는 걸로 시작해서 강의를 한 두 개 정도 보는 걸로 마무리했습니다. 원론적인 조망 설명이 공식 문서가 엄청 잘 되어있거든요. 강의자료에는 생략되었거나 헷갈리는 부분이 좀 있죠...

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 입니다. 이전에 정리했던 전체 구조에서는 어디에 위치하냐면요... 그림을 보시면 되겠습니다.

출처: https://docs.spring.io/spring-security/reference/servlet/architecture.html

  • 모든? 대다수의? 클래스가 abstract class AbstractAuthenticationProcessingFilter 을 상속합니다. 그래서 절차가 판박이입니다.
    다른 필터들을 보면 똑같이 생긴 구조에 이름이랑 구성요소만 바뀌어있다는 걸 확인하실 수 있습니다.
    1. 초기값으로 사용할 Authentication 을 만듭니다. 사용자가 로그인한다고 ID 와 암호를 넣었다면 그거에서 만들어내겠죠?
      • 각 인증방법마다(하위클래스겠죠?) 만들어내는 인증 정보 "interface Authentication"의 클래스는 다 다릅니다. 가령, UsernamePasswordAuth(생략)Proc(생략)Filter 에서는 UsernamePasswordAuthenticationToken을 만들겁니다.
    2. 초기 인증정보가 만들어졌으니, 이걸 지지고 볶으라고 AuthenticationProvider 들한테 넘겨줍니다. 아, 이건 매니저가 관리하고 있었죠? Provider를 직접 호출하지는 않고 AuthenticationManager (보통 ProviderManager) 에 대신 지지고 볶아달라고 위임합니다.
    3. 이제 Auth(생략)Proc(생략)Filter 의 손에는 지지고 볶아진 최종 인증 정보 interface Authentication 이 있을겁니다. 여기에다 대고 성공했는지 물어보고, 거기에 따라 다른 절차를 수행합니다. 밑에 서비스랑 핸들러들 보이시죠?

UsernamePasswordAuthenticationFilter 를 보세요. 위에랑 똑같이 생겼고 구성요소만 다르죠?

강의에서 본 내용

이렇게 개념들을 정리한 뒤에 강의를 다시 보면 감회가 새롭습니다.

특히 이번에 새로 본 강의 동영상인 "04. Authentication 메커니즘" 에서는 UsernamePasswordAuthenticationToken 을 받아서 커스텀으로 만든 StudentAuth(생략)Token 과 TeacherAuth(생략)Token 을 반환하는 StudendAuth(생략)Provider, TeacherAuth(생략)Provider 를 만들어서 실제로 이게 어떻게 돌아가는지 보여줍니다.

아 그리고... 이 그림은... 좀 그랬어요... 그림은 무엇을 나타내려는지가 명확해야 하고 기존 기호들이랑 헷갈리지 않게 그려야 하는데 의문의 동그라미를 가리키는 상속선은 구조를 이해하고 있지 않다면 그림만 봤을 때 오해하기에 딱 좋습니다.

https://gitlab.com/jongwons.choi/spring-boot-security-lecture/-/blob/master/part1/Lec-4%20Authentication%20%EB%A7%A4%EC%BB%A4%EB%8B%88%EC%A6%98.md

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
패스트캠퍼스: https://bit.ly/37BpXiC

#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #한번에끝내는JavaSpring웹개발마스터초격차패키지Online

시큐리티는 강의만 따라가서는 이해하기가 몹시 어려울 것 같아서 따로 찾아보는 것도 병행해야 할 것 같습니다. 오늘은 실습을 해보진 못했지만 언제 실습도 꼭 해봐야겠네요.