1. OAuth2.0
a. OAuth2.0이란
'OAuth*(Open Authorization)*'는 인터넷 사용자들이 비밀번호를 제공하지 않고, 다른 웹사이트 상의 자신들의 정보에 대해 웹사이트나 애플리케이션의 접근 권한을 부여할 수 있는 공통적인 수단으로써 사용되는 접근 위임을 위한 개방형 표준을 의미합니다.
사용자의 아이디와 비밀번호 없이 접근 권한을 위임받을 수 있다는 것은, 로그인 및 개인정보 관리 책임을 'Third-Party Application(google, kakao, naver 등)'에 위임할 수 있다는 것으로, 로그인 및 개인정보 관리에 대한 책임을 위임하는 것뿐만 아니라, 부여받은 접근 권한을 통해 서드파티 프로바이더가 가지고 있는 사용자의 리소스 조회 등의 기능을 수행할 수 있습니다.
💡서드 파티 프로바디어(Third-Party Provider)란
특정 서비스나 제품을 제공하는 주체로, 일반적으로 직접 서비스나 제품을 제공하는 주체(1차)와 소비자(2차) 사이에서 역할을 수행하는 외부 업체를 의미한다.
흔히 우리에게는 '소셜 로그인'으로 잘 알려져 있습니다. 독자적인 폼 로그인을 진행하지 않더라도 카카오, 페이스북, 네이버와 같은 서드파티 프로바이더들에게 인증 과정을 위임하고 사용자를 식별해냅니다.
그 중, OAuth2라고 불리우는 이유는 당연히도 이전 버전이 존재하기 때문입니다. 2010년 IETF에서 'OAuth 1.0' 공식 표준안이 RFC 5849로 발표되었으며, OAuth의 세션 고정 공격을 보완한 'OAuth 1.0a'를 거쳐, 현재는 OAuth의 구조적인 문제점을 해결하고, 핵심 요소만을 차용한 프로토콜 WRAP(Web Ressource Access Protocol)을 기반으로 발표한 'OAuth 2.0'가 많이 사용되고 있습니다.
따라서 우리는 이러한 OAuth2.0을 통해 서드 파티 프로바이더에게 인증과 인가를 위임함으로써, 클라이언트(OAuth2 Client)에 접근 토큰(OAuth2 Access Token)을 발급하는 것에 대한 구조로 이해할 수 있습니다.
b. OAuth2.0에서 사용하는 단어 정리
단어 | 설명 | 추가 설명 |
Resource Owner | 리소스 소유자, 쉽게 표현하면 특정 서드파티 애플리케이션의 회원이면서, 우리의 서비스를 이용하고자 하는 사용자를 의미 | |
Client | 클라이언트, OAuth2와 연관된 서버(Authorization Server, Resource Server)에 대한 접근을 요청하는 서비스를 의미 | '클라이언트'라는 이름 때문에 혼동이 있을 수 있지만, OAuth2 Server에 요청을 보내는 주체가 OAuth2 Client가 되므로, 백엔드 서버가 Client에 해당됩니다. |
Provider, Server | 프로바이더, OAuth2 서버(Authorization + Resource)를 구현함으로써 OAuth2 서비스를 제공하는 서드파티 제공자를 의미 | kakao로 예를 들어보자면, 인증 서버는 카카오의 OAuth 2.0 서버(토큰 발급), 리소스 서버는 카카오의 API 서버(사용자 정보, 친구 목록 등 제공)로 구성되어있습니다. |
Authorization Server | 권한 서버, Resource Owner를 인증하며 Client에게 Access Token을 발급 | |
Resource Server | 자원 서버, 사용자의 보호된 자원을 소지하고 있는 서버로 권한 서버에서 우선 Access Token을 받아야 접근이 가능 | |
Authorization Grant | 권한 획득 자격, Resource Server에 접근 가능한 AccessToken을 발급받기 이전에 발급 받는 권한 승인 코드 | |
Access Token | 접근 토큰, 해당 접근 토큰을 통해 Resource Server로부터 Resource Owner의 정보를 획득 가능 | 해당 글에서는 별도로 발급하는 JWT Access Token도 정리하므로, 두 개념을 분리하기 위해 'OAuth2 Access Token'으로 작성한합니다. |
c. OAuth2.0 인증 방식 및 동작 과정
c-1. Authorization Code Grant Process
💡Authorization Code Grant Process / 권한 부여 코드 승인 방식
1. OAuth2.0 Client(백엔드)가 Authorization Server에 접근 권한을 요청(API 요청)한다.
1-1. 요청 시 발급한 client_id, redirect_url, response_type=code를 쿼리 파라미터로 포함한 요청을 보낸다.
1-2. 프로바이더가 제공하는 자체 로그인 폼 팝업을 출력하게 된다. (ex. 카카오 로그인 폼, 네이버 로그인 폼 등.)
2. Resource Owner가 프로바이더가 띄운 로그인 폼을 통해 로그인을 시도한다.
2-1. Authorization Server는 권한 부여 코드 요청 시 전달받은 redirect_uri로 Authorization Code(권한 부여 승인 코드)를 전달한다.
2-2. 권한 부여 승인 코드를 통해 사용자 인증 및 자원서버에 접근할 때 필요한 OAuth2 Access Token을 획득할 수 있다.
3. 권한 부여 승인 코드를 가지고, Authorization Server에 OAuth2 Access Token을 요청한다.
3-1. 요청 시 발급한 client_id, redirect_url, grant_type, code(권한 부여 승인 코드)를 쿼리 파리미터로 포함한 API 요청을 보낸다.
3-2. 성공적으로 인증되면, OAuth2 Access Token을 전달한다.
4. OAuth2 Access Token을 소지한 Client는 Resource Server에게 보호하고 있는 Resource Onwer의 사용자 자원을 요청한다.💡Access Token을 획득하는 과정에서 Authorization Code 발급 과정이 들어간 이유?
Authorization Code를 발급받는 과정이 생략되고 OAuth2 Access Token을 바로 발급받는다면,
Authorization Server는 권한 부여 코드 요청 시 전달받은 redirect_uri로 OAuth2 Access Token을 전달해야 한다.
Redirect URI을 통해 데이터를 전달하는 방법은 URI 자체에 데이터를 실어 전달하는 방법밖에 없으며, 이 방법을 사용하면 중요한 데이터인 OAuth2 Access Token이 브라우저를 통해 바로 노출되게 된다.
Authorization Code 발급 과정이 추가된 경우, redirect uri로 전달된 Authorization Code를 백엔드 레벨에서 해당 승인 코드를 포함한 API 요청으로 OAuth2 Access Token을 발급받을 수 있다.
이 과정을 통해 백엔드 사이에서OAuth2 Access Token이 전달되기 때문에 액세스 토큰의 탈취 위험이 줄어드는 등, 다른 방식에 비해 보안적으로 안전하다는 특징이 있다.
d. Spring OAuth2 Client
Spring에서는 Security와 함께 OAuth2 Client 라이브러리가 존재합니다. OAuth2 Client 라이브러리는 OAuth2 Client로써 구현해야 하는 대부분의 내용을 쉽게 구성할 수 있도록 도와주는 라이브러리입니다.
프로바이더 로그인 폼으로 이동시켜주는 엔드포인트 자동 생성부터 권한 부여 승인 코드를 기반으로 Access Token 발급 받기 기능을 상세한 구현 없이 쉽게 사용할 수 있으며, OAuth2 Access Token을 사용해 자원서버로부터 받은 자원을 다루는 서비스를 추가 구현하기만 하면 위의 프로세스를 모두 손쉽게 만들 수 있습니다.
'Programming > Spring' 카테고리의 다른 글
[Spring] 동시성 처리 (18) | 2024.11.15 |
---|---|
[Spring] Security + JWT + OAuth2를 이용한 로그인 구현 (5) - OAuth2.0 로그인 관련 클래스 생성 (0) | 2024.11.12 |
[Spring] Security + JWT + OAuth2를 이용한 로그인 구현 (3) - Spring Security 개념과 처리 과정 (0) | 2024.11.06 |
[Spring] Security + JWT + OAuth2를 이용한 로그인 구현 (2) - JWT 관련 클래스 생성 / JWT 인증 로직 (0) | 2024.10.29 |
[Spring] Security + JWT + OAuth2를 이용한 로그인 구현 (1) - JWT란? (0) | 2024.10.29 |