API 이용 시 인증과 리소스에 대한 권한부여는 필수사항입니다.
인증과 권한부여의 대표적인 방법 중 하나가 OAuth 입니다.
1. 정의
OAuth란 Open Authorization, Open Authentication 을 뜻하는 것으로 어플리케이션(페이스북, 구글, 트위터) 유저의 비밀번호를 Third party 앱에 제공하지 않고 인증, 인가를 할 수 있는 open standard protocol입니다.
OAuth인증을 통해 어플리케이션 API를 유저 대신 접근할 수 있는 권한을 얻을 수 있습니다.
기존 방식
- - 외부 사이트와 인증 기반의 데이터 연동 시 인증 방식의 표준이 없다.
- - 기본 인증인 id, pw를 사용하여 인증
- - 사용자의 pw 노출 우려가 큰 보안상 취약한 구조
OAuth 1.0
- 기존과는 다르게 API를 제공하는 서버에서 진행
- 사용자가 인증되었다는 Access Token을 발급
- 발급된 Access Token으로 Third Party 어플리케이션에서는 Service Provider의 API를 안전하고 쉽게 사용 가능
2. OAuth에서 사용되는 용어
User | Service Provider에 계정의 가지고 있으면서 Consumer앱을 이용하려는 사용자 |
Service Provider | OAuth를 사용하는 Open API를 제공하는 서비스 (Facebook, Google 등) |
Protected Resource | Service Provider로부터 제공되어지는 API 자원들 |
Consumer | OAuth 인증을 사용해 Service Provider의 기능을 사용하려는 애플리케이션이나 웹 서비스 |
Consumer Key | Consumer가 Service Provider에게 자신을 식별하는데 사용하는 키 |
Consumer Sercret | Consumer Key의 소유권을 확립하기 위해 Consumer가 사용하는 Secret |
Request Token | Consumer가 Service Provider에게 접근 권한을 인증받기 위해 사용하는 값으로 인증이 완료된 후에는 Access Token으로 교환된다. |
Access Token | 인증 후 Consumer가 Service Provider의 자원에 접근하기 위한 키를 포함한 값 |
Token Secret | 주어진 토큰의 소유권을 인증하기 위해 소비자가 사용하는 Secret |
3. OAuth의 WorkFlow
- Service Provider로 부터 Consumer Key, Consumer Secret을 발급받는다. 이를 통해 Service Provider는 Consumer를 식별할 수 있다.
- A&B: Consumer정보, Signature 정보를 포함하여 Request Token을 요청하고 Service Provider로부터 Request Token을 발급받는다.
- C: Consumer는 User를 Service Provider 인증 사이트로 다이렉트 시키고 User는 그곳에서 Service Provider의 User임을 인증한다.
- D: Service Provider는 해당 User가 인증되면 OAuth_token 과 OAuth_verifier를 넘겨준다.
- E: Consumer가 서명을 만들어 Access Token을 요청한다.
- F: Servie Provider는 받은 토큰과 서명들이 인증 되었으면 Access Token을 넘긴다.
- G: Access Token 및 서명 정보를 통해 Service Provider에 Protected Resource에 접근할 수 있게 된다.
OAuth2.0
OAuth1.0 User의 인증플로우, 목적만 공유하고 OAuth1.0을 새로 작성한 것입니다.
앱, 웹, 데스크탑 어플리케이션 등의 인증방식을 강화하고 Consumer 개발 간소화를 중심으로 작성된 것입니다.
OAuth2.0 은 인증 절차가 간소화됨으로써 개발자들이 구현하기 더 쉬워졌습니다.
기존에 사용하던 용어가 바뀌었으며 Authorization Server와 Resource Server의 분리가 명시적으로 되었습니다.
또한, 다양한 인증 방식을 지원하고 있습니다.
1. 인증 절차 간소화
- 기능의 단순화, 기능과 규모의 확장성 등을 지원하기 위해 만들어졌습니다.
- 기존의 OAuth1.0은 디지털 서명 기반이었지만 OAuth2.0의 암호화는 https 에 맡겨 복잡한 디지털 서명에 관한 로직을 요구하지 않기 때문에 구현자체가 개발자 입장에서 쉬워졌습니다.
2. 용어 변경
- Resource Owner : 사용자
- Resource Server : REST API 서버(1.0 Protected Resource)
- Authorization Server: 인증 서버(API서버와 같을 수도 있음, 1.0 Service Provider)
- Client: Third Party 어플리케이션(1.0 Consumer)
3. Resource Server와 Authorization Server 의 분리
- 인증서버를 별도로 분리해둠
- Authorization Server의 역할을 명확히 함
4. 다양한 인증 방식(Grant_type)
- Authorization Code Grant
- Implicit Grant
- Resource Owner Password Credentials Grant
- Client Credentials Grant
- Device Code Grant
- Refresh Token Grant
5 인증 디테일
5.1 Authorization Code Grant
- 주특징
일반적인 웹사이트에서 소셜로그인과 같은 인증을 받을 때 가장 많이 쓰는 방식
정리
OAuth는 서버와 클라이언트 사이에 인증 완료 시 권한부여의 결과로 엑세스 토큰(Access Token)을 발급하고 이 엑세스 토큰을 이용해 클라이언트는 API에 접근 및 서비스를 요청하게 됩니다.
서버는 엑세스 토큰 기반으로 서비스와 권한에 대한 접근 여부를 판단해 데이터를 제공합니다.
출처: https://minwan1.github.io/2018/02/24/2018-02-24-OAuth/