Error & 해결방법

OAuth 2.0?

Dev.Congsik 2024. 10. 22. 10:22
728x90

OAuth 2.0이란?

OAuth 2.0은 권한 부여를 관리하기 위한 표준 프로토콜로, 다양한 애플리케이션(서드파티 앱 포함)이 리소스 소유자(사용자)의 자원(예: 프로필, 사진, 이메일)을 권한을 받아 접근할 수 있도록 설계되었습니다.

 

 

OAuth 2.0은 크게 다음의 네 가지 주요 역할을 포함합니다:

  1. 리소스 소유자(Resource Owner): 자원에 대한 소유권을 가진 사용자.
  2. 클라이언트(Client): 자원 소유자를 대신해 API 호출을 하는 애플리케이션.
  3. 권한 서버(Authorization Server): 토큰을 발급하고 권한을 부여하는 서버.
  4. 리소스 서버(Resource Server): 보호된 리소스(API)를 제공하는 서버.

 

/oauth2/token의 역할

이 엔드포인트는 OAuth 2.0 인증 flow에서 중요한 역할을 합니다. 클라이언트는 이를 통해 액세스 토큰을 얻거나 갱신할 수 있습니다. 이 액세스 토큰은 보호된 API에 요청을 보낼 때 사용됩니다. /oauth2/token 엔드포인트는 일반적으로 HTTP POST 요청을 사용합니다.

 

 

1. 토큰 요청 유형

클라이언트는 특정 **grant type(권한 부여 방식)**을 사용하여 토큰을 요청합니다. 주요 권한 부여 방식은 다음과 같습니다:

  • Authorization Code Grant: 사용자가 권한 서버에서 인증한 후, 클라이언트가 authorization code를 서버로 보내 액세스 토큰을 발급받습니다.
  • Client Credentials Grant: 클라이언트가 자신을 인증하고(보통 클라이언트 ID와 시크릿을 이용) 액세스 토큰을 받습니다. 주로 서버 간 통신에 사용됩니다.
  • Password Grant: 사용자의 자격 증명(아이디/비밀번호)을 사용하여 액세스 토큰을 받는 방식. 사용자가 직접 클라이언트에 자신의 자격 증명을 제공하는 경우입니다.
  • Refresh Token Grant: 기존에 발급된 리프레시 토큰을 사용해 새로운 액세스 토큰을 발급받습니다. 만료된 액세스 토큰을 갱신하는 방식입니다.

 

2. 요청 포맷

/oauth2/token에 대한 요청은 일반적으로 다음과 같은 형식을 따릅니다. 이 요청은 보통 POST 방식으로 전송됩니다.

<샘플 로그>
POST /oauth2/token HTTP/1.1 Host: authorization-server.com Content-Type: application/x-www-form-urlencoded grant_type=authorization_code& code=AUTHORIZATION_CODE& redirect_uri=YOUR_REDIRECT_URI& client_id=YOUR_CLIENT_ID& client_secret=YOUR_CLIENT_SECRET

<실제 로그>
[25/Sep/2024:14:04:36 +0900] "POST /oauth2/token HTTP/1.0" 200 207 "-" 0.394 0.394 0.394 "-" "-" "grant_type=refresh_token&refresh_token=[토큰값]"
[25/Sep/2024:14:04:39 +0900] "POST /oauth2/token HTTP/1.0" 200 207 "-" 0.017 0.017 0.017 "-" "-" "grant_type=refresh_token&refresh_token=[토큰값]"
[25/Sep/2024:14:04:40 +0900] "POST /oauth2/token HTTP/1.0" 200 207 "-" 0.003 0.003 0.003 "-" "-" "grant_type=refresh_token&refresh_token=[토큰값]"
[25/Sep/2024:14:04:42 +0900] "POST /oauth2/token HTTP/1.0" 200 207 "-" 0.012 0.012 0.012 "-" "-" "grant_type=refresh_token&refresh_token=[토큰값]"
[25/Sep/2024:14:04:44 +0900] "POST /oauth2/token HTTP/1.0" 200 207 "-" 0.008 0.008 0.008 "-" "-" "grant_type=refresh_token&refresh_token=[토큰값]"
[25/Sep/2024:14:04:45 +0900] "POST /oauth2/token HTTP/1.0" 500 193 "-" 44.180 44.180 44.180 "-" "-" "grant_type=password&client_id=[사용자 클라이언트 정보]&"
[25/Sep/2024:14:04:45 +0900] "POST /oauth2/token HTTP/1.0" 500 193 "-" 42.599 42.599 42.599 "-" "-" "grant_type=password&client_id=[사용자 클라이언트 정보]&"
[25/Sep/2024:14:04:49 +0900] "POST /oauth2/token HTTP/1.0" 200 207 "-" 0.009 0.009 0.009 "-" "-" "grant_type=refresh_token&refresh_token=[토큰값]"
[25/Sep/2024:14:04:51 +0900] "POST /oauth2/token HTTP/1.0" 500 193 "-" 36.506 36.506 36.506 "-" "-" "grant_type=password&client_id=[사용자 클라이언트 정보]&"
[25/Sep/2024:14:04:52 +0900] "POST /oauth2/token HTTP/1.0" 500 193 "-" 36.553 36.553 36.553 "-" "-" "grant_type=password&client_id=[사용자 클라이언트 정보]&"
[25/Sep/2024:14:04:52 +0900] "POST /oauth2/token HTTP/1.0" 500 193 "-" 33.732 33.732 33.732 "-" "-" "grant_type=password&client_id=[사용자 클라이언트 정보]&"
  • grant_type: 어떤 권한 부여 방식을 사용할지 나타냅니다. 예를 들어 authorization_code, client_credentials, password, refresh_token 등이 있습니다.
  • code: authorization_code 방식에서 클라이언트가 받은 인증 코드.
  • client_id: 클라이언트의 ID.
  • client_secret: 클라이언트가 서버에 등록할 때 발급받은 시크릿 키.
  • redirect_uri: 토큰이 전달될 때 사용할 리디렉션 URI.

 

3. 응답 포맷

요청이 성공하면 서버는 액세스 토큰과 함께 다양한 정보를 응답으로 보냅니다. 이 응답은 일반적으로 JSON 형식으로 반환됩니다.

{ "access_token": "ACCESS_TOKEN", "token_type": "Bearer", "expires_in": 3600, "refresh_token": "REFRESH_TOKEN", "scope": "read write" }
  • access_token: 보호된 리소스에 접근할 때 사용되는 토큰.
  • token_type: 토큰의 유형, 주로 Bearer 타입이 사용됩니다.
  • expires_in: 액세스 토큰의 만료 시간(초 단위).
  • refresh_token: 만료된 액세스 토큰을 갱신하기 위해 사용되는 토큰.
  • scope: 액세스 토큰이 허가된 권한의 범위.

 

주요 동작 흐름

  1. 클라이언트는 적절한 권한 부여 방식을 사용하여 /oauth2/token 엔드포인트에 토큰을 요청합니다.
  2. 권한 서버는 요청을 검증하고 올바른 경우 액세스 토큰리프레시 토큰을 발급합니다.
  3. 클라이언트는 받은 액세스 토큰을 사용해 보호된 리소스에 접근합니다.
  4. 액세스 토큰이 만료되면, 클라이언트는 리프레시 토큰을 사용해 새로운 액세스 토큰을 발급받을 수 있습니다.

 

예시: Authorization Code Grant 흐름

  1. 사용자 인증 요청:
    • 클라이언트는 사용자를 권한 서버에 리디렉션하고, 사용자에게 권한을 부여하도록 요청합니다.
  2. 인증 코드 발급:
    • 사용자가 로그인하고 권한을 부여하면 권한 서버는 authorization code를 클라이언트로 보냅니다.
  3. 액세스 토큰 요청:
    • 클라이언트는 받은 authorization code를 /oauth2/token 엔드포인트로 전송해 액세스 토큰을 요청합니다.
  4. 액세스 토큰 발급:
    • 권한 서버는 클라이언트의 요청을 검증하고, 액세스 토큰을 발급하여 클라이언트에게 전달합니다.

 

결론

/oauth2/token 엔드포인트는 OAuth 2.0 프로토콜에서 핵심적인 역할을 하며, 클라이언트가 액세스 토큰을 얻거나 갱신할 때 사용됩니다. 이를 통해 애플리케이션은 인증을 거친 사용자나 시스템의 자원에 안전하게 접근할 수 있습니다.

728x90