이번 강의에서는
AuthenticationProviders 인터페이스 내부에
가능한 메소드들이 무엇인지 이해하여
우리만의 맞춤 AuthenticationProviders를 정의하고 싶을 때마다
보수할 수 있도록 하는 것을 배우겠습니다
AuthenticationProviders 인터페이스 안에는
두 가지 추상 메소드가 있습니다
첫 번째는 Authenticate 메소드입니다
이 방법은 여러분이 인증 논리를 작성할 때
필요한 중요한 방법입니다
보시다시피 이 메소드에서는
입력값은 Spring Security 필터들에 의해 발생한
엔드 유저의 유저 이름과 신임증이 포함된
인증 객체입니다
여러분이 이 Authenticate 메소드 내의
모든 사업 논리를 실행했으면
여러분은 이 방식에서 성공적인 인증 정보를
생산하고 있는지
인증 객체를 출력값으로
작성하고 있는지 확인해야 합니다
하지만 이번엔 우리가 AuthenticationProviders로부터
출력하는 인증 객체 안에서 말입니다
그것은 인증이 성공적이었는지에
대한 정보를 가지고 있어야
ProviderManager가 가용 가능한
다른 AuthenticationProviders들을 불러올지
판단할 수 있습니다
그리고 두 번째 추상 메소드는 supports입니다
이 supports 메소드을 사용하려면
우리는 Spring Security 프레임워크에
AuthenticationProviders의 도움으로 지원하고 싶은 인증의 종류를
알려주어야 합니다
가장 일반적으로 사용되는 인증 방식은
유저 이름과 비밀번호의 도움을 받는 것입니다
만약 여러분이 유저 이름과
비밀번호 인증의 형태로 지원하고 싶다면
"나는 유저 이름 비밀번호 인증 방식을
방식을 지원하고 싶다"라고
지원 방식 내에서 언급해주어야 합니다
그것을 구성하는 것은
몇 분 내로 토의해볼 것입니다
하지만 지금으로서는 이러한 supports 메소드를 사용하는 것은
Spring Security 프레임워크에
어떤 인증의 종류에 제 AuthenticationProviders가 부름을 받아야 하는지
말해주는 것입니다
그럼 우리의 IntelliJ IDEA들 안에 있는
AuthenticationProviders 인터페이스를 보며 확실하게 이해해봅시다
이것이 제 AuthenticationProviders 인터페이스이고
이 인증 방식 내에서 우리는
인증의 사업 논리를 전부 작성해야 합니다
이곳을 보시면
AuthenticationProviders가 과거 인증 객체의 인증을 지원할 수 없다면
그런 경우에는 해당 인증을 지원하는
다음 AuthenticationProviders가 시도될 것이라는 게
명확하게 드러나 있습니다
이것은 제 ProviderManager를 위한 것입니다
제 AuthenticationProviders가
성공적인 인증을 제공할 수 없는 경우
작업 내에서 사용 가능한 다음 AuthenticationProviders를
시도할 것입니다
아래로 내려 보시면 우리가 가진 두 번째 메소드인
supports 메소드입니다
그럼 supports 메소드에서도 같은 방식으로 코드를 어떻게 작성할지
이해해 봅시다
우선 우리는 DAOAuthenticationProvider에
무엇이 있는지 이해해야 합니다
DAOAuthenticationProvider로 가서
supports 메소드를 보면
이 supports 메소드 내에
"나는 UsernamePasswordAuthenticationToken 형태의
모든 인증을 다룰거야"라는
의미의 간단한 코드가 보이실 겁니다
대부분의 경우에서 우리의 엔드 유저들을
유저 이름과 비밀번호로 인증하고 싶기 때문에
우리는 항상
support 클래스에 들어있는 AuthenticationToken 또한 항상 고려해야 합니다
왜냐하면 여러분이 인증 도중에 제작할
세 번째 매개변수인 OTP를
구현하고 싶다고 해도
우선적으로 유저 이름과 비밀번호로
사용자를 올바르게 인증해야 하기 때문입니다
그게 성공적으로 이루어졌다면
그 다음 사용자를 OTP 페이지로 이동시켜야 합니다
OTP는 여러분의 요구 사항에 기반하여
정의할 수 있는 개별 비즈니스 로직입니다
따라서 여러분이 OTP 인증을 진행 할 때
Spring Security를 개입시킬 일은 없습니다
따라서 유저 이름과 비밀번호의 도움을 받는
인증의 초기 단계에서 Spring Security 프레임워크를
가볍게 연관시킬 수 있습니다
그것이 우리가 사용하려고 하는
AuthenticationProviders 내에서
같은 AuthenticationToken을 사용할 수 있는 이유입니다
여기서 여러분은
Spring Security으로 가능한 인증 구현에는
어떤 종류들이 있는지
의문을 가질 수 있을 것입니다
그런 구현이
UsernamePassworkAuthenticationToken일 경우
우리는 언제든 사용자를 인증할 때
유저 이름과 비밀번호의 도움으로 사용할 수 있습니다
유사하게 같은 패키지 안에 보시면
TestingAuthenticationToken이라는
다른 토큰이 있습니다
이 토큰은 많은 보안을 할애하고 싶지 않은
unit testing에서
사용하고 싶을 때 언제든 사용할 수 있습니다
이 토큰은 TestingAuthenticationProvider라는
AuthenticationProviders 안에서 사용되고 있습니다
TestingAuthenticationProvider에
들어가서 확인해보면
Authentication 메소드에
인증 논리가 없습니다
이 AuthenticationProviders는 unit testing이나 자동화 스크립트를
시험해 운행하고 있을 때
사용하는 것이 목적이므로
단순히 받는 인증 객체를 출력하는 것입니다
이런 상황에서는
불필요하게 보안을 할애하기 싫기 때문에
다음과 같은 AuthenticationProviders를
그 상황들에서 사용합니다
이 AuthenticationProviders에 대해
여러분은 supports안에 그냥 사용하고 있음을 볼 수 있고
인증 객체를 TestingAuthenticationToken으로
가지고 있는 인증 방식을
지원할 것입니다
이 부분이 명확하기를 바라고 여러분은 여기서
이 supports 메소드의 목적은 무엇인지
실제로 어디서 사용되는지 의문을 가질 수 있을 것입니다
돌아가서 ProviderManager를 확인하시면
이 Authenticate 메소드 내의 ProviderManager의 할 일은
Spring Security내부에
사용 가능한 AuthenticationProviders를
모두 시도해보는 것입니다
특정 상황에서
사용 가능한 10개에서 20개의 AuthenticationProvider가
Spring Security안에 있어도
저는 추가적으로 customer AuthenticationProvider를 작성해도 무방합니다
이 모든 AuthenticationPovider와
이 Authentication 메소드 내에
작성한 논리를 호출했다면
이것은 불필요한 상황이 될 것입니다
그것이 이 반복문 안에서
제 ProviderManager가 할 첫 번째 일이
주어진 AuthenticationProvider가
주어진 인증의 객체를 지원하는지 확인하는 일인 이유입니다
이 Authentication 메소드를 보시면
우리는 인증의 객체를 받는 것입니다
이 authentication에서 우리는
구현 클래스가 무엇인지 이해하려고 하는 것이고
같은 방식으로 주어진 AuthenticationProviders에 의해
지원되고 있는지 확인하는 것입니다
DAOAuthenticationProviders의 상황에서는
우리는 UsernamePasswordAuthenticationToken을
받을 것입니다
그것이 DAOAuthenticationProvider가 호출되는 이유입니다
TestingAuthenticationToken의 상황에서는
이 TestingAuthenticationProvider가
호출될 것입니다
아니면 제 ProviderManager는
이 continue 구문을 이용해
단순히 그 특정 AuthenticationProvider를 무시할 것입니다
이것이 여러분만의 맞춤 AuthenticationProvider를
구현하고 싶을 때마다
이해해야 할 것입니다
이것이 여러분에게 이해가 됐길 바랍니다
다음 강의에서는 웹사이트 내에서
여러분만의 AuthenticationProviders를
구현하기 시작해보겠습니다
감사드리며 다음 강의에서 뵙겠습니다
수고하셨습니다