ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • OAuth - Authorization Code Grant Type
    concept/server 2020. 11. 2. 21:01

    educative 번역, 요약한 자료입니다.

    What is grant type?

    OAuth 2.0에서 grant type이라는 용어는 애플리케이션이 액세스 토큰을 얻는 방법을 나타낸다.

    grant type은 웹 앱이든, 네이티브 앱이든, 웹 브라우저를 출시할 능력이 없는 장치든, 서버 대 서버 애플리케이션이든 특정 용도에 최적화된다.

     

     

    Authorization Code grant type

    인증 코드 부여 유형은 가장 일반적으로 사용되는 OAuth 2.0 grant type이다.

    유저가 승인한 후 인증 서버에서 액세스 토큰을 얻기 위해 웹 앱과 네이티브 앱 모두에서 사용된다.

    인증 코드 흐름은 백엔드가 있는 웹 사이트 및 모바일 앱에 가장 적합하다.

      이 유형은 액세스 토큰에 대한 authorization 코드를 교환하는 추가 단계를 갖는다. 액세스 토큰에 대한 authorization 코드 교환은 백 채널에서 이루어진다. 이 기능으로 인해 추가 보안 레이어를 제공하게 된다.

     

     

    Authorization Code grant type Working

    1단계 : Authorization request

    첫 번째 단계에서 클라이언트 앱(PicsArt)은 리소스 소유자(사용자)를 권한 부여 서버의 권한 부여 끝점으로 리디렉션한다.

     이 앱은 권한 부여 서버가 클라이언트 앱과 그 의도를 식별하는 데 도움이 되는 몇 가지 쿼리 매개변수를 보낸다.

     

    request 요청에 전송되는 query parameter들

    1. response type

    예상되는 response type을 정의한다.

     

    2. client_id

    이 매개 변수는 리소스에 대한 액세스가 필요한 클라이언트의 ID를 정의한다. 우리의 예에서, 그것은 PicsArt 앱의 클라이언트 ID가 될 것이다.

     

    참고! 이 client_id가 어디서 왔는지 궁금할 수 있다. 모든 클라이언트 앱은 먼저 인증 서버(ex. github, facebook)에 등록해야 한다.

    클라이언트가 인증 서버에 등록되면, 그것은 인증 서버에 자신을 식별하는 데 사용되는 고유한 client_id 및 client_secret이 제공된다.

     

    3. redirect_uri

    이것은 권한 부여 서버가 리소스 소유자와의 상호 작용을 완료한 후 리디렉션하는 URI입니다. 

     

    4. scope

    이 파라미터는 액세스를 요청하는 리소스를 정의한다. 이것은 필수 매개변수가 아니며, 인증 서버가 제공되지 않은 경우, 인증 서버는 이 클라이언트에 대해 이미 정의된 기본 리소스에 대한 액세스를 제공한다. (ex. 이미지만 액세스 할 것인지 여부)

     

    5. state

    응용 프로그램은 임의의 문자열을 생성하여 요청에 포함시킨다. 
    그런 다음 사용자가 앱을 승인한 후 동일한 값이 반환되는지 확인해야 한다. CSRF 공격을 막기 위해 사용한다.

     

    그래서 request는 이렇게 작성된다.

    https://authorization.server.dummy.com/authorize
    ?response_type=code
    &client_id=12345
    &redirect_uri=https://client.dummy.com/callback
    &scope=images_read
    &state=abcde

     

     

    2단계 : Authorization response

    사용자가 Authorization 서버에 대한 동의를 제공하는 경우 Authorization 서버는 브라우저를 요청에 제공된 redirect_uri로 리디렉션한다. 

     

    response에 보내지는 파라미터들

    1. code

    Authorization 서버에서 생성된 Authorization 코드 입니다.

    이 코드는 비교적 수명이 짧으며 client_id, resource_owner, 스코프 및 redirect_uri에 바인딩되어 있다.

     

    2. state

    요청과 함께 전달된 문자열이다.

     

    그래서 response url은 이렇게 작성된다.

    https://authorization.server.dummy.com/callback
    ?code=hhdf6hsbhjG66hgtgfGGHJGCHJ
    &state=abcde

     

    3단계 : Token request

    클라이언트가 승인 코드를 받은 후에는 토큰 끝점에 사후 요청을 보내 액세스 토큰과 코드를 교환할 수 있다.

     

    request 요청과 함께 다음 parameter가 전송된다.

    1. grant_type

    이 경우 값은 accreditation_code가 될 것이다.

    이것은 클라이언트가 권한 부여 코드 부여 유형을 사용 중임을 토큰 endpoint 에 알려준다.

     

    2. code

    authorization response 에서 받은 코드

     

    3. client_id

    client의 client_id 이다

     

    4. client_secret

    이 필드는 요청이 클라이언트를 가장한 공격자가 아닌 등록된 클라이언트에 의해 전송되는지 확인하기 위한 것이다.

     

    예시는 다음과 같다.

    POST /token/endpoint HTTP/1.1
     
      Host: authserver.dummy.com
     
    grant_type=authorization_code
    &code=hhdf6hsbhjG66hgtgfGGHJGCHJ
    &client_id=12345
    &client_secret=gh5Gdkj743HFG45udbfGfs

     

     

    4단계 : Token response

    token의 endpoint는 요청의 모든 파라미터를 확인한다.

    코드가 만료되지 않은 상태이며, client_id와 client secret이 일치하면, 액세스 토큰이 반환된다.

     

    HTTP/1.1 200 OK
    Content-Type: application/json
     
    {
      "access_token":"YT3774ghsghdj6t4GJT5hd",
      "token_type":"bearer",
      "expires_in":3600,
      "refresh_token":"YT768475hjsdbhdgby6434hdh",
      "scope":"images_read"
    }

     

     

    “왜 액세스 토큰을 가지고 오는데 두 단계나 거쳐야 할까요?

    왜 먼저 authorization code 를 받아서 액세스 토큰과 교환해야 하는 거지?..”

     

     

    이것을 이해하기 위해서는 2가지 컨셉을 먼저 알아야 한다.

     

    1. 프론트 : 서버 채널에 대한 브라우저/모바일 앱의 보안 감소

    2. 백 : 서버 간 통신 채널 보안 강화

     

    프론트엔드에서 client secret을 공유하고 액세스 토큰을 가지고 오는 것은 위험하다.

     

    그래서 우리는 먼저 프론트엔드를 이용해서 authorization code를 가져오고, 백엔드를 이용해서 액세스 토큰을 요청한다.

     

    출처 : educative

    'concept > server' 카테고리의 다른 글

    OAuth - Client Credentials Grant Type  (0) 2020.11.03
    OAuth - Implicit Grant Type (암시적 승인 타입)  (0) 2020.11.02
    OAuth 2.0 Intro, 용어  (0) 2020.11.02
    Cross-site Request Forgery (CSRF)  (0) 2020.11.01
    Cross-site Scripting Attack (XSS)  (0) 2020.11.01

    댓글

Designed by Tistory.