개발블로그

OAuth의 개요 본문

카테고리 없음

OAuth의 개요

개발자수니 2019. 5. 9. 21:38

우리는 지금까지 수없이 많은 웹사이트에 가입을 해왔습니다. 모든 사이트의 계정이 동일하면 까먹을 일이 없겠지만, 패스워드 규칙도 다르고 중복된 아이디도 존재할 수 있기 때문에 모두 동일하게 할 수 없었을 것입니다. 회원가입을 할때면, 한번쯤 생각해봤을 것입니다. “모든 사이트의 계정이 다 통일됐으면 좋겠다..” 

 

SSO(Single Sign On)를 도입하면 전혀 불가능한 일은 아닙니다. 그리고 이 SSO를 구성하기 위한 방법 중 하나로 OAuth2.0이 있습니다.

아마 많은 사이트가 OAuth의 인증 방식을 이용하기 때문에 다음과 같은 화면을 한번쯤은 보셨을 것입니다.

 

 

어떻게 네이버/카카오/페이스북/페이코 계정으로 티몬(타 사이트)에 로그인이 되는지, 그 인증 구조에 대해 알아보겠습니다.

인증하는 방법은 4가지가 있고, 상황에 따라 선택할 수 있습니다.

  • 인가코드 승인(Authorization Code)
  • 암시적 승인(Implicit)
  • 자원 소유자 패스워드 승인(Resource Owner Password)
  • 클라이언트 인증 정보 승인(Client Credentials)

 

티몬(타 사이트)에 네이버 계정으로 로그인하는 것을 가정하에, 인증 방법 4가지를 살펴보겠습니다.

[인가코드 승인]

 

위 그림에서 사용자 에이전트는 브라우저, 클라이언트는 티몬, 인가서버는 네이버입니다.

  1. 사용자가 “네이버로 로그인” 버튼을 클릭하면, 티몬에서는 네이버의 로그인 URL로 리다이렉트 시켜 네이버의 로그인 창을 띄웁니다. 
  2. 사용자는 네이버의 로그인 창에 계정 정보를 입력합니다.
  3. 네이버의 로그인 창에 입력한 계정 정보가 유효하면 Authorization Code와 상태값을 반환합니다. (이후의 흐름은 계정 정보가 유효하다는 것을 가정합니다.)
  4. 사용자는 반환받은 Authorization Code와 상태값으로 티몬 서버에 로그인하겠다는 요청을 보냅니다.
  5. 티몬 서버는 Authorization Code, 티몬의 private key를 통해 네이버 서버로부터 Access Token을 발급받습니다. 여기서의 Access Token은 JWT입니다. 
    이후, 사용자는 이 Access Token으로 티몬에 접근할 수 있습니다. 
  6. Access Token은 결국 브라우저에 저장될 것이고, 매 요청마다 Access Token을 이용해 티몬에 접속할 것입니다. 

 

[암시적 승인]

암시적 승인은 인가코드 승인 과정의 3,4,5 과정이 압축된 형태라고 볼 수 있습니다. 

  1. 사용자가 “네이버로 로그인” 버튼을 클릭하면, 티몬에서는 네이버의 로그인 URL로 리다이렉트 시켜 네이버의 로그인 창을 띄웁니다.
  2. 사용자는 네이버의 로그인 창에 계정 정보를 입력합니다.
  3. 네이버의 로그인 창에 입력한 계정 정보가 유효하면 Access Token과 상태를 반환합니다. (이후의 흐름은 계정 정보가 유효하다는 것을 가정합니다.)
  4. 이후, 사용자는 이 Access Token으로 티몬에 접근하게 됩니다. 

 

[자원 소유자 패스워드 승인]

인가코드 승인 방식과 암시적 승인 방식은 사용자가 네이버에 접속해 네이버 계정을 입력했습니다. 그러나 자원 소유자 패스워드 승인은 티몬에게 네이버의 계정 정보를 건네주고, 티몬이 네이버에게 계정 정보가 유효한지 확인을 하는 방식으로 동작합니다. 따라서 네이버 계정이 티몬에게 노출되므로 이 유형은 바람직하지 않습니다. 다른 유형으로 인증할 수 없는 경우에만 사용해야하는데, 브라우저를 사용할 수 없는 클라이언트인 경우에 이 방법을 사용합니다. 그럴 가능성이 없겠지만 예를 들어, 파워포인트에서 페이스북으로 로그인을 할 수 있는 기능이 생긴다면 그때는 자원 소유자 패스워드 승인 방법을 이용해야 할 것입니다. 

 

 

[클라이언트 인증 정보 승인]

 

지금까지의 방식은 사용자의 계정 정보가 네이버 계정인지 인증하는 작업이었다면, 이 방식은 티몬이 네이버의 오픈 API를 이용할 수 있는지 인증하는 작업입니다. 예를 들어, 네이버 오픈 API 중 특정 사용자가 자주 검색하는 키워드를 알려주는 유료 API가 있다고 가정을 해봅시다. 그리고 티몬은 그 API를 사용해 티몬 서비스에 이용하려고 합니다. 네이버의 입장에서는 본인들이 API를 제공하기로 협약을 맺은 곳에만 API요청 결과를 반환해야하므로, 계정 정보를 요구할 것입니다. 그 과정에서 이 클라이언트 인증 정보 승인 유형을 사용해야할 것입니다. 

 


이 글은 Nextree의 글을 읽고 해석하여 작성한 글입니다.

Comments