728x90
OAuth 2.0이란?
OAuth 2.0은 권한 부여를 관리하기 위한 표준 프로토콜로, 다양한 애플리케이션(서드파티 앱 포함)이 리소스 소유자(사용자)의 자원(예: 프로필, 사진, 이메일)을 권한을 받아 접근할 수 있도록 설계되었습니다.
OAuth 2.0은 크게 다음의 네 가지 주요 역할을 포함합니다:
- 리소스 소유자(Resource Owner): 자원에 대한 소유권을 가진 사용자.
- 클라이언트(Client): 자원 소유자를 대신해 API 호출을 하는 애플리케이션.
- 권한 서버(Authorization Server): 토큰을 발급하고 권한을 부여하는 서버.
- 리소스 서버(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: 액세스 토큰이 허가된 권한의 범위.
주요 동작 흐름
- 클라이언트는 적절한 권한 부여 방식을 사용하여 /oauth2/token 엔드포인트에 토큰을 요청합니다.
- 권한 서버는 요청을 검증하고 올바른 경우 액세스 토큰과 리프레시 토큰을 발급합니다.
- 클라이언트는 받은 액세스 토큰을 사용해 보호된 리소스에 접근합니다.
- 액세스 토큰이 만료되면, 클라이언트는 리프레시 토큰을 사용해 새로운 액세스 토큰을 발급받을 수 있습니다.
예시: Authorization Code Grant 흐름
- 사용자 인증 요청:
- 클라이언트는 사용자를 권한 서버에 리디렉션하고, 사용자에게 권한을 부여하도록 요청합니다.
- 인증 코드 발급:
- 사용자가 로그인하고 권한을 부여하면 권한 서버는 authorization code를 클라이언트로 보냅니다.
- 액세스 토큰 요청:
- 클라이언트는 받은 authorization code를 /oauth2/token 엔드포인트로 전송해 액세스 토큰을 요청합니다.
- 액세스 토큰 발급:
- 권한 서버는 클라이언트의 요청을 검증하고, 액세스 토큰을 발급하여 클라이언트에게 전달합니다.
결론
/oauth2/token 엔드포인트는 OAuth 2.0 프로토콜에서 핵심적인 역할을 하며, 클라이언트가 액세스 토큰을 얻거나 갱신할 때 사용됩니다. 이를 통해 애플리케이션은 인증을 거친 사용자나 시스템의 자원에 안전하게 접근할 수 있습니다.
728x90
'Error & 해결방법' 카테고리의 다른 글
csv 파일 인코딩 이슈 해결법 (0) | 2024.11.26 |
---|---|
REST API? (2) | 2024.11.14 |
org.springframework.web.client.HttpServerErrorException$BadGateway: 502 Bad Gateway 에러 원인 및 해결방법 (1) | 2024.10.11 |
뉴맨틀? (1) | 2024.09.12 |
[FCM] Firebase Cloud Messaging? (2) | 2024.09.10 |