[U4 S4] OAuth2 인증(Authentication)
학습목표
- OAuth2의 인증 방식을 설명할 수 있다.
- Authentication Code와 Access Token의 차이에 대해 이해할 수 있다.
- Authentication Server와 Resource Server의 차이에 대해 이해할 수 있다.
- Spring Security 기반의 애플리케이션에 OAuth2를 적용할 수 있다.
OAuth2란?
OAuth2 : 특정 애플리케이션에서 사용자의 인증을 직접 처리하는 것이 아니라 사용자 정보를 보유하고 있는 신뢰할 만한 써드 파티 애플리케이션(Google, Facebook, GitHub 등)에서 사용자의 인증을 대신 처리해주고 Resource에 대한 자격 증명용 토큰을 발급한 후, Client가 해당 토큰을 이용해 써드 파티 애플리케이션의 서비스를 사용하게 해주는 방식

<OAuth2 프로세스 흐름표(출처: WebSan(websan.com)>
OAuth2를 사용하는 애플리케이션 유형
- 써드 파티 애플리케이션에서 제공하는 API의 직접적인 사용
- Google, Facebook, GitHub 등 신뢰할만한 써드 파티 애플리케이션에서 제공하는 API를 직접적으로 사용하는 애플리케이션 구현에 OAuth2 사용
- 사용자가 OAuth2 인증 프로토콜을 이용해 인증에 성공하면 써드 파티 애플리케이션에서 제공하는 API를 활용한 커스텀 서비스를 제공
- 추가적인 인증 서비스 제공 용도
- 써드 파티 애플리케이션의 서비스를 이용하는 것뿐만 아니라 추가적인 인증 서비스를 제공하기 위해 사용
- 일반적으로 제공하는 아이디/패스워드 로그인 인증 이외에 OAuth2 이용한 로그인 인증방법 추가적으로 제공
- 특정 서비스를 제공하는 애플리케이션에서 사용자의 크리덴셜(Credentail)을 남기고 싶지 않을 경우 OAuth2 로그인 인증 방법으로 로그인만 사용
OAuth2 동작 방식
OAuth2 인증 컴포넌트(Component, 구성요서)들의 역할
- Resource Owner : 사용하고자 하는 Resource의 소유자
- Resource : Google, Facebook, Github 등 신뢰할만한 써드 파티 애플리케이션의 서비스
- Client : Resource Owner를 대신해 보호된 Resource에 액세스하는 애플리케이션
- Resource Server : Client의 요청을 수락하고 Resource Owner에게 해당하는 Resource를 제공하는 서버
- Authorization Server : Client가 Resource Server에 접근할 수 있는 권한을 부여하는 서버

<OAuth 2 컴포넌트 간의 상호작용을 통한 인증 처리 흐름(출처 : 코드스테이츠)>
OAuth2 인증 프로토콜에서 사용되는 용어
- Authorization Grant : Client 애플리케이션이 Access Token을 얻기 위한 Resource Owner의 권한을 표현하는 크레덴셜(Credential)
- Authorization Grant의 유형
- Authorization Codet : 권한 부여 승인 코드 방식
- Implicit Grant Type : 암묵적 승인 방식
- Client Credentials : 클라이언트 자격 증명 승인 방식
- Resource Owner Password Credentials : 자원 소유자 자격 증명 승인 방식
- Access Token : Client가 Resource Server에 있는 보호된 Resource에 액세서하기 위해 사용하는 자격 증명용 토큰
- Authorization Code와 Client Secret을 이용해 Authorization Server로부터 전달받은 Access Token으로 자격을 증명하면 Resource Server에 접근 가능
- Scope : 주어진 액세스 토큰을 사용하여 액세스할 수 있는 Resource의 범위
Authorization Grant 유형
-
Authorization Code Grant : 권한 부여 승인 코드 방식
-
권한 부여 승인을 위해 자체 생성한 Authorization Code를 전달하는 방식으로, 가장 많이 사용되는 기본적인 방식
-
Authorization Code Grant 방식은 Refresh Token 사용 가능
-
권한 부여 승인 요청시 응답 타입(response_type)을 code로 지정 요청

<Authorization Code Grant 방식의 인증 처리 흐름(출처 : 코드스테이츠)>
-
Implicit Grant : 암묵적 승인 방식
-
별도의 Authorization Code 없이 바로 Access Token을 발급하는 방식
- 자격증명을 안전하게 저장하기 힘든 Client(자바스크립트 등 스크립트 언어 사용하는 브라우저)에 최적화된 방식
-
Refresh Token 사용이 불가능하며, Authorization Server는 Client Secret을 통해 클라이언트 인증 과정을 생략
-
권한 부여 승인 요청시 응답 타입(response_type)을 token으로 지정하여 요청

<Implicit Grant 방식의 인증 처리 흐름(출처 : 코드스테이츠)>
-
Resource Owner Password Credential Grant : 자원 소유자 자격 증명 승인 방식
-
간단하게 로그인 시 필요한 정보(Username, Password)로 Access Token을 발급받는 방식
- 자신의 서비스에서 제공하는 애플리케이션의 경우에만 사용되는 인증방식
-
Refresh Token 사용 가능
-
Authorization Server, Resource Server, Client가 모두 같은 시스템에 속해 있을 떄만 사용 가능

<Resource Owner Password Credential Grant 방식의 인증 처리 흐름(출처 : 코드스테이츠)>
-
Client Credentials Grant : 클라이언트 자격 증명 승인 방식
-
Client 자신이 관리하는 Resource 혹은 Authorization Server 에 해당 Client를 위한 제한된 Resource 접근 권한이 설정되어 있는 경우 사용할 수 있는 방식
-
자격 증명을 안전하게 보관할 수 있는 Client에서만 사용되어야 하며, Refresh Token은 사용 불가

<Client Credentials Grant 방식의 인증 처리 흐름(출처 : 코드스테이츠)>