인증(Authentication)과 권한 부여(Authorization)의 필요에 의해..

oauth의 목적은 access token을 발급하는 것.

Roles

OAuth는 4가지 역할을 정의한다. :

Resource Owner (≒ User)

보호 자원protected resource에 접근하는 권한을 부여한다. Resource Owner 가 개인일 경우 이를 end-user 라고도 한다.

Client (≒ Application)

Reqource Owner 를 대신하여 보호 자원에 접근을 요청하는 어플리케이션이다.

Resource Server (≒ Naver, Google, …​)

보호 자원을 호스팅하는 서버로, Access Token 을 사용하여 보호 자원 요청을 수락하고 적절한 응답을 한다. 즉, 데이터를 가진 서버.

Authorization Server

성공적으로 Resource Owner 를 인증(authenticating)하고 authorization을 얻은 이후 Client 에게 Access Token 을 발급한다. 즉, 인증과 관련된 처리를 전담하는 서버.

Authorization ServerResource Server 간의 상호 작용interaction은 이 스펙의 범위를 벗어난다. Authorization ServerResource Server 와 동일하거나 별도의 서버일 수 있다. 단일 Authorization Server 는 여러 Resource Server 에서 승인된 Access Token 을 발급할 수도 있다.

1. 등록

  1. 클라이언트가 리소스 서버를 이용하기 위해서는 리소스 서버의 승인을 사전에 받아놔야 함. → register

  2. 서비스마다 다르지만 공통적으로 아래 3개의 값을 공통적으로 받음

    Client ID, Client Secret, Authorized redirect URIs

    • Client Secret은 외부에 노출되면 안됨.

    • Redirect URI: 리소스 서버가 권한을 부여하는 과정에서 인증 Code를 전달하기 위한 주소

2. 인증

  1. Resource Owner가 Client에 접근

  2. Client가 Resource Owner에게 "네이버의 어떠한 기능 활용하기 위해 동의가 필요합니다." 노출

  3. 네이버의 인증 버튼을 클릭하면 Resource Owner는 아래 구조와 같은 링크로 이동

    https://resource.server/
         ?client_id=1
         &scope=B,C
         &redirect_uri=https://client/callback
  4. Resource Server가 Resource Owner의 로그인 상태 파악

  5. 로그인 되어 있을 경우 Client ID와 Redirect URI를 검증

  6. Resource Owner에게 Client 에게 리소스를 제공해도 되는지 승인 요청

  7. Resource Owner가 허용할 경우 Resource Server는 서버에 사용자와 리소스 허용 범위를 저장함

  8. Resource Server가 ResourceOwner에게 redirect URI에 authorization code(임시 패스워드)를 붙혀서 전달

  9. Resource Owner는 주어진 리다이렉트 주소로 이동하게 됨

  10. Client는 authorization code를 획득함

  11. Client는 Resource Server에 접근함

    https://resource.server/token?
         grant_type=authorization_code&
         code=3&
         redirect_uri=https://client/callback&
         client_id=1&
         client_secret=2
  12. Resource Server는 authorization code를 조회해서 어떤 Client ID인지 조회

  13. Resource Server는 Client ID, Secret, Redirect URI, Code 모두 일치하는지 확인

  14. Resource Server는 authorization code를 제거

  15. Resource Server는 accessToken을 발급

  16. Client에게 accessToken을 전달

  17. Client는 accessToken을 서버에 저장함

Protocol Flow

Figure 1: Abstract Protocol Flow
@startuml
ditaa
     +--------+                               +---------------+
     |        |--(1)- Authorization Request ->|   Resource    |
     |        |                               |     Owner     |
     |        |<-(2)-- Authorization Grant ---|               |
     |        |                               +---------------+
     |        |
     |        |                               +---------------+
     |        |--(3)-- Authorization Grant -->| Authorization |
     | Client |                               |     Server    |
     |        |<-(4)----- Access Token -------|               |
     |        |                               +---------------+
     |        |
     |        |                               +---------------+
     |        |--(5)----- Access Token ------>|    Resource   |
     |        |                               |     Server    |
     |        |<-(6)--- Protected Resource ---|               |
     +--------+                               +---------------+

@enduml
  1. 클라이언트가 사용자의 데이터에 접근하기 위해 권한을 요청한다.

  2. 접근에 동의함을 증명하는 권한 부여 동의서(Authorization Grant)를 발급한다. REC 6749에서는 4가지 유형의 권한 부여 동의서를 정의한다.

  3. 권한 부여 동의서를 제출하여 접근 토큰을 요청한다. 접근 토큰은 사용자 데이터를 잠근 자물쇠를 여는 열쇠이다.

  4. 권한 부여 동의서를 확인하여 사용자가 동의한 데이터에 대한 정보가 담긴 접근 토큰을 제공한다.

  5. 접근 토큰을 제출하여 사용자 데이터를 요청한다.

  6. 사용자 데이터를 제공한다. 이때 앱이 제출한 접근 토큰이 유요함을 확인하고, 접근 토큰의 정보를 확인하여 제공할 데이터 항목 범위 및 유효기간이 정해진다.

Authorization Grant

Authorization Code

Figure 3: Authorization Code Flow
@startuml
ditaa
     +----------+
     | Resource |
     |   Owner  |
     |          |
     +----------+
          ^
          |
         (B)
     +----|-----+          Client Identifier      +---------------+
     |         -+----(A)-- & Redirection URI ---->|               |
     |  User-   |                                 | Authorization |
     |  Agent  -+----(B)-- User authenticates --->|     Server    |
     |          |                                 |               |
     |         -+----(C)-- Authorization Code ---<|               |
     +-|----|---+                                 +---------------+
       |    |                                         ^      v
      (A)  (C)                                        |      |
       |    |                                         |      |
       ^    v                                         |      |
     +---------+                                      |      |
     |         |>---(D)-- Authorization Code ---------'      |
     |  Client |          & Redirection URI                  |
     |         |                                             |
     |         |<---(E)----- Access Token -------------------'
     +---------+       (w/ Optional Refresh Token)
@enduml

Implicit

Figure 4: Implicit Grant Flow
@startuml
ditaa
     +----------+
     | Resource |
     |  Owner   |
     |          |
     +----------+
          ^
          |
         (B)
     +----|-----+          Client Identifier     +---------------+
     |         -+----(A)-- & Redirection URI --->|               |
     |  User-   |                                | Authorization |
     |  Agent  -|----(B)-- User authenticates -->|     Server    |
     |          |                                |               |
     |          |<---(C)--- Redirection URI ----<|               |
     |          |          with Access Token     +---------------+
     |          |            in Fragment
     |          |                                +---------------+
     |          |----(D)--- Redirection URI ---->|   Web-Hosted  |
     |          |          without Fragment      |     Client    |
     |          |                                |    Resource   |
     |     (F)  |<---(E)------- Script ---------<|               |
     |          |                                +---------------+
     +-|--------+
       |    |
      (A)  (G) Access Token
       |    |
       ^    v
     +---------+
     |         |
     |  Client |
     |         |
     +---------+
@enduml
  • JavaScript 애플리케이션에서 많이 사용됨

  • access token이 노출되는 것을 전제로 함

    • PKCE(Proof Key for Code Exchange)

      PKCE(Proof Key for Code Exchange) 지원은 모바일 디바이스에서 권한 코드 플로우를 수행할 때 보안을 추가하는 기능(RFC 7636에 정의됨)입니다.

      — https://www.ibm.com/docs/ko/sva/9.0.7?topic=support-proof-key-code-exchange
  • refresh token을 지원하지 않음

    • 이것을 가로채 사용자의 상호작용 없이 갱신이 가능하므로?

  • 인증용 웹페이지에 접근하여 로그인/동의하고, 전달받은 리다이렉트 URL로 access token을 전달하는 것으로 이해함

    • 그럼, 모바일에서는 redirect 처리를 어떻게 할 것인지?

    • redirect url을 전달받으면 변경될 가능성이 있으므로 별도 개발자센터를 통해서 전달받은 URL로 리다이렉트해줘야 할 것으로 보임

Resource Owner Password Credentials

Figure 5: Resource Owner Password Credentials Flow
@startuml
ditaa
     +----------+
     | Resource |
     |  Owner   |
     |          |
     +----------+
          v
          |    Resource Owner
         (A) Password Credentials
          |
          v
     +---------+                                  +---------------+
     |         |>--(B)---- Resource Owner ------->|               |
     |         |         Password Credentials     | Authorization |
     | Client  |                                  |     Server    |
     |         |<--(C)---- Access Token ---------<|               |
     |         |    (w/ Optional Refresh Token)   |               |
     +---------+                                  +---------------+
@enduml

Client Credentials

Figure 6: Client Credentials Flow
@startuml
ditaa
     +---------+                                  +---------------+
     |         |                                  |               |
     |         |>--(A)- Client Authentication --->| Authorization |
     | Client  |                                  |     Server    |
     |         |<--(B)---- Access Token ---------<|               |
     |         |                                  |               |
     +---------+                                  +---------------+
@enduml

Etc

User

서비스 제공자와 소비자를 사용하는 계정을 가지고 있는 개인

Consumer

Open API를 이용하여 개발된 OAuth를 사용하여 서비스 제공자에게 접근하는 웹사이트 또는 애플리케이션

Service Provider

OAuth를 통해 접근을 지원하는 웹 애플리케이션(Open API를 제공하는 서비스)

Consumer Secret

서비스 제공자에서 소비자가 자신임을 인증하기 위한 키

Request Token

소비자가 사용자에게 접근권한을 인증받기 위해 필요한 정보가 담겨있으며 후에 접근 토큰으로 변환된다.

Access Token

인증 후에 사용자가 서비스 제공자가 아닌 소비자를 통해서 보호된 자원에 접근하기 위한 키를 포함한 값.

JWT

11

References