자 이제
Spring Security 내부 흐름을 다룰 시간입니다
보시다시피 첫 단계는
유저가 로그인 페이지에 본인의 자격 증명을 입력하는 것입니다
이게 제일 첫번째 단계입니다
유저는 백엔드 서버에 이 요청을 호출하는데
브라우저의 도움이나
모바일 애플리케이션의 도움
또는 Postman의 도움을 받습니다
즉 클라이언트는 뭐든 될 수 있습니다 이 첫 단계에서
유저는 본인의 자격 증명과 함께
요청을 백엔드 웹 애플리케이션에 전송하는데
여기서는 그것을 Spring Security 프레임워크의
도움을 받아 보호하고 있습니다
서블릿 컨테이너 또는 Tomcat 서버 또는 웹 애플리케이션이
이 요청을 수신함과 동시에
우리 클래스 경로에 Spring Security를 추가해두었기 때문에
Spring Security 팀 자체적으로 개발한
Spring Security 필터들이 몇 개 있습니다
이 필터들의 목적은
백엔드 서버에 들어오는
모든 요청을 감시하는 것입니다
이 필터들은 저의 엔드 유저가
접근하고자 하는 경로를 확인합니다
이 웹 애플리케이션에 구성해둔
경로와 설정에 따라 이 필터들은
이것이 보호된 자원인지
공개적으로 접근 가능한 자원인지를 판별할 것입니다
이에 따라 이 필터들은
해당 엔드 유저에게 인증을 강제해야 할지
아닐지 결정합니다
그 결과에 따라 로그인 페이지를 표시할 것이고
이는 엔드 유저가 저의 보안 웹페이지에 접근하는
첫 번째 시도에 발생할 겁니다
두 번째부터는
인증이 성공적이었다면
이 Spring Security 필터들은
유저가 이미 로그인했는지 아닌지
체크하는 로직도 갖출 겁니다
그에 따라 이 필터들은 로그인 페이지를 강제하지 않을 것이고
단순히 첫 번째 로그인 단계에서 발생한
기존 세션 ID나
기존 토큰을 활용할겁니다
Spring Security 필터라 함은
굉장히 많은 필터가 있는데
Spring Security 프레임워크 안에는
20개 이상의 필터가 있습니다
각각의 필터는 고유한 역할과 책임이 있습니다
물론 추후 강의에서 이 필터 중 몇 개를
살펴보고자 합니다
지금은 일단 Spring Security 필터가
우리 웹 애플리케이션을 보호하는 데에
중요한 역할을 한다는 것을 기억해주시기 바랍니다
이 과정에서
Spring Security 필터는 또한 엔드 유저가 보내는
유저네임과 비밀번호를 추출하고
이 유저네임과 비밀번호를
2단계 안의 인증 객체로 변환합니다
인증 객체는 Spring Security 프레임워크 안에서
엔드 유저의 정보를 저장하기 위한
핵심 표준이기 때문에
2단계에서 저의 인증 객체는
유저 네임과 자격 증명만을
보유할 겁니다
이 인증 객체가 형성되면
저의 Spring Security 필터들은
이 요청을 인증 관리자(authentication manager)에게 넘길 겁니다
이름에서 알 수 있듯이
이 인증 관리자는 실질적인 인증 로직을 관리하는
관리 인터페이스 또는 클래스입니다
이 인증 관리자가 하는 일이 무엇이냐면
제 웹 애플리케이션 안에
어떤 인증 제공자(authentication providers)가 존재하는지 확인합니다
그럼 제가 1개, 2개 혹은 무한대의
인증 제공자를 정의할 수 있다면
이 인증 제공자들 내부에
실질적인 인증 로직을 정의할 수 있습니다
어떤 데이터베이스나 LDAP 서버에서
아니면 인가 서버나 저의 캐시에서
유저 자격 증명을 확인할 것인지 말입니다
이런 모든 비즈니스 로직을
인증 제공자 내부에서 작성할 수 있습니다
또한 여러분의 웹 애플리케이션 내부에
다수의 인증 제공자를 작성할 수 있습니다
예컨대 인증 제공자 하나는
유저 네임과 비밀번호 인증을 담당하게 하고
다른 인증 제공자는 로그인하기 위해
OR 매핑을 프레임워크에
활용하게 할 수도 있습니다
따라서 여러분의 요구 사항에 따라
무한대로 인증 제공자를 정의할 수 있습니다
특정 요청에 대해
유효한 인증 제공자가 어떤 것인지
확인하는 것이
인증 관리자의 책임입니다
이에 따라 인증 관리자는 이 요청을
해당 인증 관리자들에 전송할 겁니다
이 요청이 인증 성공 또는 인증 실패 지점에
도달할 때까지 말입니다
따라서 저의 인증 관리자는 이 요청을
인증 제공자들 중 하나에 전송하는 것 뿐 아니라
관리자가 첫 번째 인증 제공자에
요청을 전송했고
인증이 실패한 시나리오를 생각해 보겠습니다
이 시나리오에서 인증 관리자는
단순히 로그인에 실패했다는 응답을 엔드 유저에게
반환하는 것이 아닙니다
대신 가능한 모든
인증 제공자들을 시도할 것입니다
모든 인증 관리자를 시도했고
모든 시도에서 인증 실패한 시점에서야
인증 관리자는 엔드 유저에게
인증이 실패했다고 응답할 것입니다
이게 인증 관리자의 역할이고
인증 제공자로 돌아와서
여기를 보시면
다수의 인증 제공자가 있을 수 있습니다
당연히 우리가 설정할 수 있는데
그 설정을 어떻게 해야 하는지 추후 강의에서
다룰 예정입니다
이 인증 제공자 안에서
실질적인 인증 로직을 직접 작성하거나
UserDetailsManager UserDetailsService라는
Spring Security에서 제공하는
인터페이스와 클래스를 활용할 수도 있습니다
어떤 인증을 수행하고자 할 때
저의 요구 사항은 당연히
데이터베이스 같은 저장소나 LDAP으로부터
유저 정보를 불러오는 것이기 때문입니다
이 유저 정보를 불러온 다음
엔드 유저가 제공한 정보와
저장소 안에 저장된 정보를 비교할 수 있습니다
이 모든 사전 정의된 로직은
대부분의 프로젝트에서 요구하는 공통 로직인데
이 UserDetailsManager와 UserDetailsService
인터페이스에 이미 제공됩니다
물론 원한다면 우리의 로직 전체를
인증 제공자 내부에 직접 작성할 수도 있습니다
이 시나리오들을 모두 다뤄볼건데
일단은 인증 제공자의 역할과
이 인증 제공자 내부에
인증을 수행하는 모든 비즈니스 로직을
작성한다는 것을 여러분이 확실히 이해했기를 바랍니다
하지만 여러분이 Spring Security 프레임워크에서
기본적으로 제공되는 인증 제공자를
활용하고 싶다면 이들은
UserDetailsService와 UserDetailsManager의
도움을 받게 됩니다
인증서 내부에는 비밀번호가 있는데
보안 측면에서 취약하기 때문에
이 비밀번호를 그냥 저장하거나
일반 텍스트 비밀번호로 인증을 수행하고 싶지는 않습니다
그렇기 때문에 비밀번호를 저장소에 저장하거나
엔드 유저가 제공한
비밀번호를 불러와
확인하고자 할 때는 항상
암호화 또는 해싱해야 합니다
이 모든 비밀번호 관련
표준과 로직을 수행하기 위해
Spring Security 프레임워크 안에는
Password Encoder 인터페이스와
그 구현 내용이 있습니다
그래서 UserDetailsService 또는 UserDetailsManager와
Password Encoder는
엔드 유저가 제공한 자격 증명이
유효한지 협동해서 판별합니다
그 결과에 따라 인증 제공자에게 자격 증명이 유효한지
성공적인지 아닌지 알려줍니다
인증 제공자의 프로세싱이 끝나면
이를 다시 인증 관리자에게 넘깁니다
인증 관리자로부터
이 정보는 Spring Security 필터들로 돌아갑니다
응답을 엔드 유저에게 전송하기 전에
Spring Security 필터들은
2단계에서 이들이 생성한
인증 객체를 보안 컨텍스트 안에
저장하려고 합니다
9단계에서
보안 컨텍스트 내부에
저장하려고 하는 인증 객체는
이런 정보를 갖게 됩니다
인증이 성공적이었는지 아닌지
세션 ID가 무엇인지 입니다
Spring Security 프레임워크가
9단계에서 보안 컨텍스트 내부에
이런 인증 정보를 저장하고 있기 때문에
엔드 유저의 첫 번째 로그인 단계에서
인증이 성공적이었다면 두 번째 요청부터는
해당 유저의 자격 증명 입력을
요구하지 않습니다
이것이 9단계의 목적입니다
인증 객체와 함께
성공적인 인증 정보가
보안 컨텍스트에 저장되었다면
보호된 자원으로부터의 응답
예를 들어 웹페이지 또는 REST 서비스에 접근하려고 한다든지
이 응답은 10단계에서
엔드 유저에게 반환됩니다
이것이 Spring Security의 내부 흐름입니다
몇 가지는 여러분에게 명확하지 않을 수 있다는 것을
100% 확신하는데
이건 완벽히 정상입니다
왜냐하면 인증 제공자와 UserDetailsManager/Service
Password Encoder Spring Security 필터
인증 객체에 대해 더 다뤄야 하기 때문입니다
그러니 우리가 이 구성 요소들을
개별적으로 다룰 때 여러분은
Spring Security 내부 흐름에 대한
큰 그림을 그릴 수 있을 것이고
이 내부 흐름도를 이 과정 도중에
주기적으로 참조할 예정입니다
우리가 Spring Security 프레임워크
내부의 각 구성 요소들을
다룰 때 여러분에게
더 명확할 수 있도록 말입니다
일단은 모든 요청을 가로채는
Spring Security 필터들이 있으며
이들은 인증을 수행할지 하지 않을지
결정하는 요소라는 것을
이해하시기 바랍니다
또한 인증 관리자와 인증 제공자가
있다는 것도 말입니다
이 슬라이드에서 가능한 한 많이
기억해주십시오
분명히 말씀드렸듯이
앞으로 여러 번 다시 다룰 예정입니다
각 구성 요소에 대한 슬라이드도 있습니다
고급 개념을 일부 입력해 두었습니다
Spring Security 프레임워크에 대해
빠르게 상기하거나
인터뷰에 임할 때 참조하실 수 있습니다
그런 상황에서
이 슬라이드들이 큰 도움이 될 겁니다
그러니 이 영상이나 인용을 들으면서
필기를 하지 말아주십시오
슬라이드에 있는 내용에 의존하시면 됩니다
이로써 Spring Security 내부 흐름에 대해
명확해졌고
다음 강의에서는
Spring Security 프레임워크의
기본 동작을 알아보고
지금까지 다뤘던 Spring Security 내부 흐름에
이것을 상호 연관시켜 보겠습니다
감사드리며 다음 강의에서 뵙겠습니다
수고하셨습니다