이 참조 페이지에서는 서비스가 Google과의 계정 연결을 지원하기 위해 구현해야 하는 API 엔드포인트를 설명합니다. 여기에는 OAuth 기반 계정 연결, 간소화된 계정 연결, 앱 플립이 포함됩니다.
기본 요건 및 표준
이러한 엔드포인트를 성공적으로 구현하려면 서비스가 다음 표준을 준수해야 합니다.
- OAuth 2.0: RFC 6749를 준수합니다.
- 토큰 취소: RFC 7009를 준수합니다.
- JSON 웹 토큰 (JWT): RFC 7519를 준수합니다 (간소화된 연결에 필요).
- HTTPS: 모든 엔드포인트는 보안 HTTPS 연결을 통해 제공되어야 합니다.
승인 엔드포인트
승인 엔드포인트는 사용자를 인증하고 Google과 계정을 연결하는 데 동의를 얻는 역할을 합니다.
- URL: Actions Console 또는 Google Cloud Console에서 구성됩니다.
- 메서드:
GET
요청 매개변수
| 매개변수 | 설명 |
|---|---|
client_id |
Google에 할당한 클라이언트 ID입니다. |
redirect_uri |
이 요청에 대한 응답을 전송할 URL입니다. |
state |
리디렉션 URI에서 변경되지 않은 상태로 Google에 다시 전달되는 회계 값입니다. |
response_type |
승인 코드 플로우의 경우 code여야 합니다. |
scope |
(선택사항) Google에서 요청하는 데이터의 범위를 공백으로 구분한 목록입니다. |
user_locale |
(선택사항) Google 계정 언어 설정입니다. BCP-47 언어 태그 (예: en-US)를 사용하여 지정됩니다. |
토큰 교환 엔드포인트
이 엔드포인트는 승인 코드를 토큰으로 교환하고 만료된 액세스 토큰을 갱신하는 역할을 합니다.
- URL: Actions Console 또는 Google Cloud Console에서 구성됩니다.
- 메서드:
POST - Content-Type:
application/x-www-form-urlencoded
승인 코드를 토큰으로 교환
초기 토큰 교환 요청에는 다음 매개변수가 사용됩니다.
요청 매개변수
| 매개변수 | 설명 |
|---|---|
client_id |
Google에 할당한 클라이언트 ID입니다. |
client_secret |
Google에 할당한 클라이언트 보안 비밀번호입니다. |
grant_type |
authorization_code이어야 합니다. |
code |
승인 엔드포인트에서 수신한 승인 코드입니다. |
redirect_uri |
초기 요청에 사용된 것과 동일한 리디렉션 URI입니다. |
갱신 토큰을 액세스 토큰으로 교환
액세스 토큰을 새로고침할 때는 다음 매개변수가 사용됩니다.
요청 매개변수
| 매개변수 | 설명 |
|---|---|
client_id |
Google에 할당한 클라이언트 ID입니다. |
client_secret |
Google에 할당한 클라이언트 보안 비밀번호입니다. |
grant_type |
refresh_token이어야 합니다. |
refresh_token |
이전에 Google에 발급된 갱신 토큰입니다. |
응답 (JSON)
HTTPS 응답 본문에 JSON 객체가 포함된 성공 응답을 반환합니다.
- HTTP 상태:
200 OK - Content-Type:
application/json;charset=UTF-8
| 필드 | 설명 |
|---|---|
token_type |
필수사항. bearer여야 합니다. |
access_token |
필수사항. 서비스의 API에 액세스하는 데 사용되는 단기 토큰입니다. |
refresh_token |
authorization_code grant_type에 필요합니다. 새 액세스 토큰을 획득하는 데 사용되는 장기 토큰입니다. |
expires_in |
필수사항. 액세스 토큰의 남은 수명(초)입니다. |
오류 응답
토큰 엔드포인트에 대한 요청이 실패하면 다음 필드가 포함된 JSON 응답과 함께 HTTP 400 Bad Request 오류를 반환합니다.
- HTTP 상태:
400 Bad Request - Content-Type:
application/json;charset=UTF-8
| 오류 필드 (JSON) | 설명 |
|---|---|
error |
필수사항. invalid_grant여야 합니다. |
error_description |
(선택사항) 추가 정보를 제공하는 사람이 읽을 수 있는 텍스트입니다. |
간소화된 연결 인텐트 처리
서비스가 간소화된 계정 연결 (Google로 로그인하는 OAuth)을 지원하는 경우 토큰 교환 엔드포인트는 JSON 웹 토큰 (JWT) 어설션을 추가로 지원하고 check, create, get 인텐트를 구현해야 합니다.
이러한 요청에는 다음 매개변수가 사용됩니다.
요청 매개변수
| 매개변수 | 설명 |
|---|---|
intent |
요청되는 구체적인 간소화된 연결 인텐트입니다(check, get 또는 create). |
grant_type |
이러한 요청의 경우 이 매개변수의 값은 항상 urn:ietf:params:oauth:grant-type:jwt-bearer입니다. |
assertion |
Google 사용자의 ID에 대한 서명된 어설션을 제공하는 JSON 웹 토큰 (JWT)입니다. JWT에는 사용자의 Google 계정 ID, 이름, 이메일 주소가 포함된 정보가 포함됩니다. 서버는 JWT 검증 섹션에 나열된 기준을 사용하여 이 JWT를 검증해야 합니다. |
client_id |
Google에 할당한 클라이언트 ID입니다. |
client_secret |
Google에 할당한 클라이언트 보안 비밀번호입니다. |
scope |
선택사항: Google이 사용자에게 요청하도록 구성한 범위입니다. 일반적으로 get 및 create 의도 중에 표시됩니다. |
response_type |
create 의도에 필요: token로 설정해야 합니다. |
JWT 검증
간소화된 연결의 보안을 보장하려면 서버가 다음 기준을 사용하여 assertion (JWT)를 검증해야 합니다.
- 서명: Google의 JWK 엔드포인트에서 제공되는 Google의 공개 키에 대해 서명을 확인합니다.
- 발급기관 (
iss):https://accounts.google.com여야 합니다. - 잠재고객 (
aud): 통합에 할당된 Google API 클라이언트 ID와 일치해야 합니다. - 만료 (
exp): 미래여야 합니다.
check 인텐트에 대한 응답
intent=check가 포함된 요청은 디코딩된 JWT 어설션의 sub 또는 email 클레임으로 식별되는 Google 계정이 사용자 데이터베이스에 있는지 확인합니다.
- HTTP 상태:
200 OK(계정 있음) 또는404 Not Found(계정 없음) - Content-Type:
application/json;charset=UTF-8
| 필드 | 설명 |
|---|---|
account_found |
필수사항. 계정이 있으면 true, 그렇지 않으면 false입니다. |
get 인텐트에 대한 응답
intent=get를 사용한 요청은 기존 Google 계정의 액세스 토큰을 요청합니다.
- HTTP 상태:
200 OK - Content-Type:
application/json;charset=UTF-8
성공 응답 JSON 객체는 성공적인 표준 토큰 교환 응답 (access_token, refresh_token 등을 반환)과 정확히 동일한 구조를 사용합니다.
계정을 연결할 수 없는 경우 HTTP 401 오류가 반환됩니다.
- HTTP 상태:
401 Unauthorized - Content-Type:
application/json;charset=UTF-8
| 오류 필드 (JSON) | 설명 |
|---|---|
error |
필수사항. linking_error여야 합니다. |
login_hint |
(선택사항) 대체 OAuth 연결 흐름에 전달할 사용자의 이메일 주소입니다. |
create 인텐트에 대한 응답
intent=create가 포함된 요청은 JWT에 제공된 정보로 새 사용자 계정을 만들도록 요청합니다.
- HTTP 상태:
200 OK - Content-Type:
application/json;charset=UTF-8
성공 응답 JSON 객체는 성공적인 표준 토큰 교환 응답 (access_token, refresh_token 등을 반환)과 정확히 동일한 구조를 사용합니다.
사용자가 이미 있는 경우 사용자에게 기존 계정을 연결하라는 메시지를 표시하기 위해 HTTP 401 오류가 반환됩니다.
- HTTP 상태:
401 Unauthorized - Content-Type:
application/json;charset=UTF-8
| 오류 필드 (JSON) | 설명 |
|---|---|
error |
필수사항. linking_error여야 합니다. |
login_hint |
대체 OAuth 연결 흐름에 전달할 사용자의 이메일 주소입니다. |
UserInfo 엔드포인트 (선택사항)
OpenID Connect Core 1.0 사양에 지정된 대로 연결된 사용자에 관한 기본 프로필 정보를 검색하는 데 사용됩니다. 이는 '간소화된 연결' 또는 '원탭 로그인'과 같은 기능에 필요합니다.
- 메서드:
GET - 인증:
Authorization: Bearer ACCESS_TOKEN
응답 (JSON)
HTTPS 응답 본문에 JSON 객체가 포함된 성공 응답을 반환합니다.
- HTTP 상태:
200 OK - Content-Type:
application/json;charset=UTF-8
응답 필드
| 필드 | 설명 |
|---|---|
sub |
필수사항. 시스템에서 사용자를 식별하는 고유 ID입니다. |
email |
필수사항. 사용자의 이메일 주소 |
email_verified |
필수사항. 이메일 주소가 인증되었는지 여부를 나타내는 불리언입니다. |
given_name |
(선택사항) 사용자의 이름입니다. |
family_name |
(선택사항) 사용자의 성입니다. |
name |
(선택사항) 사용자의 전체 이름입니다. |
picture |
(선택사항) 사용자 프로필 사진의 URL입니다. |
오류 응답
액세스 토큰이 유효하지 않거나 만료된 경우 HTTP 401 Unauthorized 오류를 반환합니다. WWW-Authenticate 응답 헤더도 포함해야 합니다.
연결 프로세스 중에 반환된 실패 응답 (4xx 또는 5xx)은 복구할 수 없는 것으로 간주됩니다. 이러한 경우 Google은 가져온 토큰을 삭제하며 사용자는 계정 연결 프로세스를 다시 시작해야 합니다.
토큰 취소 엔드포인트 (선택사항)
사용자가 Google 표시 경로에서 계정을 연결 해제할 때 Google이 서비스에 알리도록 허용합니다. 이 엔드포인트는 RFC 7009에 설명된 요구사항을 충족해야 합니다.
- 메서드:
POST - Content-Type:
application/x-www-form-urlencoded
요청 매개변수
| 매개변수 | 설명 |
|---|---|
client_id |
요청 출처를 Google로 식별하는 문자열입니다. 이 문자열은 시스템 내에서 Google의 고유 식별자로 등록되어야 합니다. |
client_secret |
서비스를 위해 Google에 등록한 비밀번호 문자열입니다. |
token |
취소할 토큰입니다. |
token_type_hint |
(선택사항) 취소되는 토큰의 유형에 관한 힌트입니다(access_token 또는 refresh_token). 지정하지 않으면 기본값은 access_token입니다. |
응답
토큰이 성공적으로 삭제되거나 토큰이 이미 유효하지 않은 경우 성공 응답을 반환합니다.
- HTTP 상태:
200 OK - Content-Type:
application/json;charset=UTF-8
오류 응답
어떤 이유로든 토큰을 삭제할 수 없는 경우 (예: 데이터베이스를 사용할 수 없음) HTTP 503 오류를 반환합니다. Google에서 나중에 또는 Retry-After 헤더에 따라 요청을 다시 시도합니다.
- HTTP 상태:
503 Service Unavailable - Content-Type:
application/json;charset=UTF-8 - 헤더:
Retry-After: <HTTP-date / delay-seconds>