코드스테이츠_국비교육/[Section4]

68.01_[Spring Security] OAuth2 인증_적용(SSR)_22.11.28

생각없이 해도 생각보다 좋다. 2022. 11. 28. 22:09

=========================================
OAuth 2 을 사용한 애플리케이션 구현_기본편(SSR)
=========================================
1. 의존성 추가
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' //타임리프 : HTML 화면 구성을 위한 템플릿
implementation 'org.springframework.boot:spring-boot-starter-security'  //현재 만드는 OAuth 2 애플리케이션은 Spring Security 기반 애플리케이션
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client' //구글의 OAuth 2 시스템을 이용하는 부분. 현재 만드는 애플리케이션은 OAuth 2 시스템의 클라이언트로써 역할을 할 예정.

2. hello-oauth2.html
: OAuth 2로 로그인 인증을 성공하면 웹 브라우저에 띄울 HTML 화면
: 이를 위해서 타임리프 사용
: 해당 페이지는 OAuth 2로 보호되는 HTML 페이지

3. HelloHomeController.java
: SSR 방식의 Controller handler method를 구현하여 hello-oauth2.html을 웹브라우저로 전송하는 코드 작성

4. SecurityConfiguration 설정
: OAuth 2 인증에 성공해야지 hello-oauth2.html을 띄우도록 설정하는 것이 목표
: Spring Boot가 대부분은 자동으로 구성해줌.

5. OAuth 2 사용을 위한 클라이언트 등록 정보 추가
: application.yml 이용 (구글 OAuth 2 시스템에서 생성한 클라이언트 ID와 클라이언트 PW 설정 )
: application.yml 에 ID 와 Secret을 설정함으로써 Spring Boot이 자동으로 ClientRegitrationRepository을 내부에서 생성함.
: 내부적으로 자동 생성이 되는 이유는 build.gradle에 추가한 oauth2-client 덕분이다

// 현재는 yml 파일에 직접 설정했지만, 민감한 정보를 실무에서 사용할 땐 OS 시스템 변수 혹은 다른 방법으로 애플리케이션 외부에서 안전하게 보관하여 사용하는 방법을 써야함.

5-1. ClientRegitrationRepository을 직접 빈으로 등록하기
: ClientRegitrationRepository 를 반환값으로 하는 메서드를 작성하고 @Bean 애너테이션을 붙임.
: ClientRegitrationRepository은 Client Id와 Client Secret을 CommonOAuth2Provider라는 객체로 묶은 정보를 메모리에 저장하는 역할을 함.
: 굳이 안해도 되는 과정이지만 이후에 필요할 경우 수동으로 사용할 상황을 대비

=========================================
OAuth2 로그인 인증 확인하기
=========================================

방법 1. SecurityContext에 저장된 인증된 Authentication을 확인하기.
: Spring Security 특성상 인증이 정삭적으로 수행되면 SecurityContext에 인증된 Authentication이 저장됨.
: 이를 확인함으로써 현재 구현한 로그인 인증이 잘 되었는지 확인할 수 있음.
: Controller에서 SecurityContext에 접근하는 방법으로 인증을 증명한다.

1-1. SecurityContextHolder을 이용해서 직접 인증된 Authentication가져오기
: SecurityContext에 접근할 땐 SecurityContextHolder를 당연히 이용한다고 생각
: SecurityContextHolder -> getContext -> getAuthentication -> getPricipal
: OAuth2User 인터페이스 참조형으로 값 받기
: SecurityContext에서 불러온 인증된 Authentication에서 유저의 이메일을 콘솔창에 출력하는 코드를 구현함.
: 콘솔창에 이메일이 출력되면 인증 성공을 증명할 수 있음.

1-2. Authentication 객체를 핸들러 메서드 파라미터로 전달 받기
: 핸들러 메서드 매개변수로 Authentication을 직접 받음.

1-3. @AuthenticationPrincipal을 이용해서 OAuth2User 객체를 핸들러 메서드로 직접 받기

=========================================

방법 2. OAuth 2 인증이 성공적으로 수행되면 내부적으로 리소스 서버에 접근할 때 사용되는 Access Token을 전달됨. 이 Access Token의 정보를 확인하는 방법.

2-1.OAuth2AuthorizedClientService를 이용해서 Access Token에 접근하기
: OAuth2AuthorizedClientService를 이용하면 권한을 부여받은 Client(이하 OAuth2AuthorizedClient)에 접근할 수 있다.
: OAuth2AuthorizedClient에 접근하기 위해서는 clientRegistrationId와 pricipalName이 필요하다.
: OAuth2AuthorizedClient를 통해 AccessToken을 호출할 수 있다.

2-2. @RegisteredOAuth2AuthorizedClient("google")애너테이션을 이용해서 OAuth2AuthorizedClient 자체를 핸들러 메서드 인자로 제공받기.
: 코드가 간결해진다.
: 하지만 여러 개의 핸들러 메서드에서 OAuth2AuthorizedClient 를 사용해야 한다면, 2-1 처럼 DI 를 받는 것이 유용할 것 이다.