제가 강의 시작 전에 이걸 만들어보았습니다
바로 단순한 Spring Boot 애플리케이션입니다
Spring Security OAUTH2 GitHub이라는 이름 하에 만들어졌는데
GitHub 리포지터리에 업로드 해둔 것과 동일한 프로젝트입니다
GitHub 리포지터리로 이동해보면
section_12 아래에, 동일한 Maven 프로젝트가 보일 것입니다
제가 Spring Boot 애플리케이션 속에 작성해둔
점수에 대해서는 신경 쓰지 않아도 됩니다
제가 모든 세부 사항들을
이번 강의에서 설명하도록 하겠습니다
제가 강의 시작 전에 만들어 둔 이유는
여러분들이 이미 Spring Boot Maven 프로젝트를
생성하는 방법에 익숙할 것이기 때문입니다
start.spring.io와 함께라면 말이죠
제가 이 Maven 프로젝트 속에서
강조하고 싶은 첫 번째 정보를 설명하겠습니다
palm.xml를 열어보십시오
여기에, 제가 이미 몇 개의 프로젝트들을 시작해두었습니다
첫 번째 프로젝트는
spring-boot-starter-oauth2-client입니다
우리가 이 dependencies을 추가해야 하는 이유는
dependencies을 추가하면 이 Spring Boot 애플리케이션은
OAUTH2 클라이언트의 역할을
맡게 될 것이기 때문입니다
우리는 Spring Boot Starter Securities Spring Boot starter web과
연관되어있는 dependencies도 더해야 합니다
이를 통해서, dependencies이 모두 다운로드 되었는지 확인하기 위해
MAVEN-build를 실행할 수 있습니다
저는 강의를 시작하기 전 이미 설정 해두었습니다
제가 공유하고자 하는 새로운 정보에 대해 이야기하겠습니다
소스 폴더로 이동하여 열어봅시다
제가 가장 먼저 소개하고 싶은 정보는
Spring Boot 메인 클래스 관한 내용입니다
Spring Boot 메인 클래스가 엄청난 내용은 아닙니다
그저 Spring Boot 애플리케이션에 주석(어노테이션) 기능이 있을 뿐입니다
그리고 이 컨트롤러를 열어본다면
보안 컨트롤러가 보일 것입니다
이것은 그저 단순한 NBC 컨트롤러입니다
다들 상상할 수 있을 법한 장치이죠
이것은 그들의 STPA가 아닙니다
이것은 springnbcpath이며 ‘/’경로를 가지고 있습니다
만약 누군가가 포트 8080를 이용하여
제 로컬 호스트에 접근하려고 한다면
이것이 바로 적용될 법한 경로입니다
이 방법 내에서 제가 GetMapping을 언급한 이유는
위 경로가 @GetMap에 접근할 것이기 때문입니다
지금 화면에서 볼 수 있듯이
저는 secure.html를 되돌리려고 하고 있습니다
이 secure.html은 통계 폴더 안에 있는
리소스 폴더에 위치합니다
secure.html을 열어보면 엄청 대단한 내용은 없습니다
그저 GitHub and OAUTH2에 성공적으로 로그인했다는
메세지만 써있을 뿐입니다
즉, 이것은 단순한 secure.html일 뿐이며
만약 엔드 유저나 리소스 소유자가
접속을 희망하더라도 secure.html에 곧바로 닿을 순 없습니다
그는 GitHub 로그인 페이지로 이동하게 될 것입니다
그가 본인 인증서를 입력하고 나서야
secure.html에 접속할 수 있는거죠
따라서, 그게 우리가 실행해보려는 구조입니다
그리고 제 AUTH 서버가 사용자를 이전과 동일한 URL
즉 "/"로 전송했을 때, 저는
OAUTH2AauthenticationToken라는 변수를 수락할 것입니다
따라서 이 토큰 안에는 엔드 유저에 대한
모든 세부 사항들이 명시되어 있는거죠
이 토큰을 사용하여, 엔드 유저에 대해
더 많은 세부 사항을 파악할 수 있습니다
이어서, 제가 이 쪽에 중단점를 두겠습니다
이를 통해 제가 GitHubAUTH 서버에서 전송 받은
토큰 속에 있는 오류를 제거할 수 있는 거죠
그리고 제가 공유하고 싶은 마지막 주요 사항은
config 폴더 안에 있습니다
이를 열면, 제가 spring security의 배치에 대한
모든 정의를 정리해두었습니다
먼저, @configuration 주석(어노테이션) 을 다는 것을 유의해야 합니다
그리고 지금까지 해왔던 것처럼 게시해주세요
저는 Security FilterChain에 대한 @bean을 생성중입니다
그리고 이 방법에서, http 패턴을 사용하는 것입니다
제 Spring Boot 애플리케이션에 도달하는
모든 요청이 인증되어야 한다는 것을
누누이 말씀 드리는 것입니다
그리고 이번에는 폼 로그인이나 HTTP basic이 아니라
OAUTH2 스타일로 로그인 해보려고 합니다
이렇기 때문에 저희가 이 방법
즉, OAUTH2 로그인을 다뤄야 하는 것입니다
제가 Spring Boot 애플리케이션에 다음과 같은 세부 사항을
제공하고 나면, 제 애플리케이션은
그랜드 플로우 내에서 클라이언트 애플리케이션 역할을 하게 됩니다
하지만 여기서 제 클라이언트 애플리케이션은
클라이언트 ID나 기밀 값을 전혀 알지 못합니다
동일한 이유로, 우리는
클라이언트 등록 유형 리포지터리에 대한 bean을 생성해야 합니다
이 방법으로, 저는 InMemoryClientRegistrationRepository에 대한
새로운 대상을 생성하고 있습니다
그리고 저는 이 과정을 거친 후, 되돌아가서
제 Spring Security 프레임워크가 클라이언트 세부사항의 위치를
파악할 수 있도록 하고 있습니다
따라서, 지금으로선 저희의 클라이언트 세부 사항을
메모리 속에 넣고 있는 것입니다
제가 언급한 모든 클라이언트 등록 세부 사항들이
"client registration"이라는 메소드 안에 위치한 것입니다
이 기법의 아웃풋은
클라이언트 등록 대상을 메모리 내에 위치한
InMemoryClientRegistrationRepository에 넘길 수 있다는 점입니다
여기, 이 '클라이언트 등록‘ 기법을 보면
보시다시피 Spring Security 프레임워크 내에서 사용 가능한
Enum(열거형) 클래스 중 하나를 활용하고 있습니다
이 Enum(열거형) 클래스는 보편적인 OAUTH2 제공자입니다
이 보편적인 OAUTH2 제공자 내에는
여러 가지의 Enum(열거형) 값이 존재합니다 예를 들어
Google Art 서버를 사용하고 싶을 시엔
'Google'이라는 Enum(열거형) 값을 사용하면 됩니다
유사하게도 우리에겐 GitHub가 있고
그 다음으로는
Facebook이 있으며 마지막으로 OKTA도 있습니다
우리가 이 Enum(열거형) 클래스를 사용해야 하는 이유는
Spring Security 때문입니다
Spring Security은 이 Enum(열거형) 내에 'getBuilder'라는
몇 개의 도우미 기법을 제공하고 있습니다
getBuilder가 모든 스코프 세부 사항들을 샅샅히
다루고 있다는 것을 알 수 있습니다
Google의 authorizationURL은 무엇인가 ?
tokenURL은 무엇인가?
certificateURL은 무엇인가?
issuerURL은 무엇인가?
userinfoURL은 무엇인가?
이게 없었다면 세부 사항들을 수동적으로 다뤄야 했을 것입니다
GitHub에도 유사하게 모든 스코프 세부 사항들을 샅샅히
다루고 있습니다
authorization URL, token URL
Facebook과 OKTA에게도 동일하죠
만약 이런 Enum(열거형) 클래스들이 Spring Security 프레임워크 내에
없었다면, 제가 직접
많은 조사를 하고
authorization URL이 무엇인지
token URL이 무엇인지를 이해해야 했을 것입니다
또, 오직 저만 클라이언트 등록을 생성할 수 있었을 것입니다
하지만 이 Enum(열거형)이 있기에, 이 과정이 매우 매우 단순해졌죠
우리는 그저 Enum(열거형) 값이 무엇인지 작동시키면 됩니다
우리의 경우엔, github 서버를 사용하고자 합니다
이것이 제가 github을 작동시키는 이유죠
그리고 이어서
getBuilder 기법을 작동시켜야 합니다
getBuilder 기법을 작동 시키기 위해선
github의 값을 패스해야 합니다
우리는 등록 과정에 제공 받았던 클라이언트 ID와 기밀 같은
기법을 작동시켜야지만
이 값들을 지날 수 있습니다
이는 지난 강의에서 다뤘던 것이기도 합니다
그리고 클래스에서는 Builder 메소드을 사용할 것입니다
그리고 제 클라이언트 애플리케이션인
Spring Boot 애플리케이션는
어떤 AUTH 서버에 연결해야하는지와 같은 모든 세부 사항을
정확히 다 파악하고 있습니다
이 경우에는 github입니다
그리고 클라이언트 ID가 무엇인지
고려해야 하는 클라이언트 기밀이 무엇인지 또한 파악해야 합니다
당연히, 우리는 이 값들을 이곳에
하드 코딩할 수는 없습니다
우리는 특정한 소유 파일을 통해서 접속하려고 해야 합니다
제품 표준 규격을 따르면서 이를 할 수 있는 것이죠
하지만 지금으로선, 이것이 간단한 웹 애플리케이션이기 때문에
이정도면 충분할 것입니다
따라서 이것이 여러분들이 따라할 수 있을 법 한 긴 과정입니다
하지만 이렇게 긴 과정을 거치지 않고
영향을 미칠 수 있는 더욱 간단한 방법이 존재합니다
그것에 대해 설명하기 전에
여러분이 언제든지 이것을 참조할 수 있도록
제가 이 코드에 접속해보겠습니다
지금 이 세부 사항들을 저장 중입니다
제가 앞서 언급한 간단한 방법은
Spring Boot 애플리케이션 내에 있는
application.properties에 들어간다면
spring.security나 2.client.registration.github.clientid 같은 것들로
클라이언트 ID와 기밀을
구성할 수 있을 것입니다
이와 비슷하게, 우리는 클라이언트 기밀도 구성할 수 있습니다
만약 제 Spring Boot 애플리케이션이 위에 언급한 두 가지를
application.properties 내에서 찾게 된다면
그것은 클라이언트 등록 저장소를 자동적으로 구성하게 될 것입니다
그리고 따로 클라이언트 등록을 해주겠죠
이것을 바탕으로, github 서버 사용을 희망한다는 것을
클라이언트 ID와 기밀을 통해
유추할 수 있을 것입니다
만약 Google이나 Facebook를 사용하고 싶다면
개별적으로 GitHub를 Google과 Facebook으로 바꾸면 됩니다
이러한 변화를 바탕으로, 이 Spring Boot 애플리케이션은
클라이언트 애플리케이션의 역할을 하며 액세스 토큰을 얻기 위해
GitHub.서버와 교류하게 될 것입니다
다음 강의에서는 방금 말씀드린 사항을 확인해보도록 하겠습니다
감사하고, 다음 수업에서 뵙겠습니다
수고하셨습니다Bye.