OAuth

2 minute read

나는 힘들게 하는 사람들에게도, 나름의 사정이 있겠지 하며
화를 삭히기보다, 이해해보려고 노력하는 하루.


OAuth https://oauth.net/2/

OAuth 2.0 는 인증을 위한 산업 표준 프로토콜이다. 실생활 기기, 데스크톱 어플리케이션, 모바일 폰, 웹 어플리케이션을 위한 인증 수단을 제공하면서 개발자의 편의성에 포커스를 맞췄다.
현재 IETF OAuth Working Group의 주도하에 개발되고 있다.

OAuth 2.0을 사용할 수 있는 대표적인 서비스
  • Slack
  • GitHub
  • Facebook
  • Google
  • FitBit
  • Kakao
  • Naver

대부분의 IT Flatform 회사에서 제공하고 있기 때문에 소셜 및 플랫폼 계정을 이용한 인증 로그인을 활용하여 다양한 프로그램이 개발되고 있는 추세이다.

Roles

OAuth 2.0을 이용하기 위해서 인증을 위한 아래의 역할에 대해서 이해하고 있어야 한다.

  • The Third-Party Application: “Client”

사용자의 계정 접근 권한을 가져오기 위해 시도하는 어플리케션으로 사용자의 허가를 통해서 어플리케이션 내에서 필요로하는 인증 수단으로 사용가능하다.

  • The API: “Resource Server”

사용자의 정보에 접근하는 API 서버의 역할을 한다.

  • The Authorization Server

사용자의 승인 및 거절에 대한 요청에 대한 인터페이스를 제공하는 인증 서버이다. 어플리케이션의 규모에 따라서 구성 자체는 달라질 수 있는데, 규모가 큰 어플리케이션의 경우 인증서버와 API 서버를 분리하여 구성한다.

  • The User: “Resource Owner”

자산의 계정의 일부분에 대한 접근을 제공하는 실제 사용자를 의미한다.

App을 만들기 위해서 필요한 것은?

OAuth 절차를 진행하기 전에, 본인이 개발한 새로운 App을 반드시 등록해야한다. 새로운 App을 등록시에, 주로 어플리케이션 명, 웹사이트, 로고 등의 정보를 등록한다. 추가로, redirect URI는 사용자들에게 우리가 개발한 웹서버, 브라우저, 모바일 App의 화면을 제공하기 위해서 반드시 등록해야한다.

Redirect URIs

Redirect URI는 사용자들에 우리가 등록한 URI를 제공하는데, 이는 몇몇의 보안에 대한 공격 시도를 막을 수 있다. 모든 HTTP redirect URI는 반드시 HTTPS로서 제공되어야한다. 이는 인증 시에 토큰을 가로채려는 시도를 방지할 수 있다.

Native apps may register a redirect URI with a custom URL scheme for the application, which may look like demoapp://redirect.

Client ID & Secret

앱을 등록하면 Client ID와 발급해주는 서버에 따라 client secret정보를 받을 수 있다. 구글의 경우, APIs & Services > Credentials 로 접속해서 생성한 OAuth 2.0 Client IDs를 보게되면 Client Secret 정보도 제공한다.

Client ID 정보는 Login URL을 설정하기 위해서 사용되고, 자바스크립트의 페이지에서 선언되어 사용될 수도 있다. 히지만 반드시 Client Secret 정보는 노출없이 안전하게 보관되어야 한다.

인증 처리 ( Authorization )

OAuth 2.0의 첫번째 단계는 사용자로 부터 권한을 획득하는 것이다. 브라우저 기반 또는 모바일 앱을 개발 시에 주로 서비스를 제공하는 업체(구글, 페이스북, 카카오, 네이버 등등)에서 제공하는 UI를 이용해서 사용자에게 제공한다.

  • 사용자의 계정을 통한 인증 획득

OAuth 2.0는 다양한 사용자 케이스를 위해서 몇가지 권한 타입(Grant Type)을 제공한다.

아래의 내용은 잘못된 번역이 오역을 만들 수 있을 것 같아 그대로 가져와서 정리하였다.

  • Authorization Code for apps running on a web server, browser-based and mobile apps
  • Password for logging in with a username and password (only for first-party apps)
  • Client credentials for application access without a user present
  • Implicit was previously recommended for clients without a secret, but has been superseded by using the Authorization Code grant with PKCE.

실제 코드 및 구현부는 추후 작성 예정


참고 : Aaron Parecki - https://aaronparecki.com/oauth-2-simplified/