TIL no.76 - BackEnd - OAuth2.0

박준규·2019년 11월 13일
1

웹 서비스, 모바일 서비스들은
REST & JSON 기반으로 API를 제공하고 있으며
인증 방식으로는 OAuth 2.0을 택하고 있습니다.

1. OAuth Overview

OAuth는 Open Authorization, Open Authentication을 뜻합니다.
애플리케이션(페이스북,구글,트위터)(Service Provider)의 유저의 비밀번호를
Third party앱에 제공하지 않고 인증,인가를 할 수 있는 오픈 스탠다드 프로토콜입니다.

2007년 10월 OAuth 1.0이 확정되었으나 보안 문제로 인해
2009년 6월 OAuth 1.0a가 발표되었고
2010년 4월에 “The OAuth 1.0 Protocol” 이라는 이름으로 RFC5849 문서 번호를 부여 받으며 IETF 표준이 되었습니다.
하지만, 정확히 구분짓기 위해 OAuth 1.0a라고 칭합니다.

2. OAuth1.0a Process

OAuth 1.0a 인증을 3-legged OAuth 라고 부르기도 하는데 그 이유는
OAuth는 세 상호작용주체가 필요하다는 뜻입니다.

OAuth 1.0a 가 작동하기 위해서는 기본적으로 user, consumer, service provider가 있어야 합니다.

간단하게 user는 트위터 사용자, consumer는 트위터 단말 어플리케이션, service provider는 트위터 API 서비스 라고 생각하면 됩니다.

OAuth 1.0a 인증 프로세스는 다음과 같습니다.

user가 service provider의 API를 사용하겠다고 로그인 할 때,(소셜 로그인 할 때)
consumer는 service provider의 로그인 화면으로 user을 redirect 하게 됩니다.

user가 로그인을 완료하면 다시 consumer로 redirect 되고
동시에 consumer는 인증토큰을 사용할 수 있게 됩니다.
이 인증 토큰은 consumer가 사용자의 아이디/패스워드 없이 허가 받은 API에 접근할 수 있게 해줍니다.

3. 인증토큰이란?

OAuth 1.0a 인증이 완료가 되면 consumer는 사용자의 아이디/패스워드를 직접 저장하게 되는 것이 아니라, access token을 받게 됩니다. 이 인증 토큰은 OAuth 2.0에서도 같은 개념으로 사용됩니다.

4. OAuth 2.0 Overview

OAuth 2.0은 OAuth 1.0a 과는 용어부터 시작해서 많은 것들이 다릅니다.
OAuth 1.0a의 모바일 환경에서의 사용성 문제, 개발의 복잡성, CPU 소비 등의 문제를 해결하기 위해 만들어졌습니다.

바뀐 용어들부터 정리해보겠습니다.

용어역할
Resource Owneruser
Resource ServerAPI server
Authorization Server인증 서버(API server와 같을 수 있음)
ClientThird-party application

Client 는 기본적으로 Confidential Client 와 Public Client 로 나뉩니다.

Confidential client는 client 증명서(client_secret)를 안전하게 보관할 수 있는 Client를 의미합니다.

Public Client는 브라우저기반 어플리케이션이나 모바일 어플리케이션 같이 client 증명서를 안전하게 보관할 수 없는 Client를 의미하는데 이런 경우 redirect_uri 를 통해서 client를 인증합니다.

5. OAuth2.0 인증 방식

OAuth 2.0이 지원하는 인증방식은 client 종류와 시나리오에 따라 나뉩니다.
하지만 실제로 Authorization Code Grant와 Implicit Grant를 제외하고는
일반적인 3-legged OAuth 가 아니기 때문에 open API에서는 많이 사용되지 않습니다.

그렇기 때문에
당장 저에게 필요한 Implicit Grant에 대해서만 설명하겠습니다.
다른 인증 방식은 잘 정리된 블로그를 참조하면 됩니다.

Implicit Grant
OAuth 1.0a과 가장 비슷한 인증방식입니다.
Public Client인 브라우저 기반의 어플리케이션(Javascript application)이나
모바일 어플리케이션에서 이 방식을 사용하면 됩니다.
Client 증명서를 사용할 필요가 없으며
실제로 OAuth 2.0에서 가장 많이 사용되는 방식입니다.

로그인시에 페이지 URL에 response_type=token 라고 넘깁니다.

6. OAuth 2.0 Bearer token

OAuth 2.0은 기본적으로 Bearer 토큰,
즉 암호화하지 않은 토큰을 주고받는 것으로 인증합니다.
기본적으로 HTTPS 를 사용하기 때문에 토큰을 안전하게 주고받는 것은
HTTPS의 암호화에 의존합니다.
또한, 복잡한 signature 등을 생성할 필요가 없기 때문에
API를 호출 할 때 간단하게 Header 에 아래와 같이 한 줄을 같이 보내서
API를 테스트해볼 수 있습니다.

Authorization: Bearer

7. reference

잘 정리된 블로그
OAuth2.0 공식 문서

profile
devzunky@gmail.com

0개의 댓글