> For the complete documentation index, see [llms.txt](https://onestore-dev.gitbook.io/dev/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://onestore-dev.gitbook.io/dev/tools/billing/v21/web-payment/member.md).

# 회원 인증

## 1.개요 <a href="#id-greater-than-apiv7-greater-than-15.-greater-than-1" id="id-greater-than-apiv7-greater-than-15.-greater-than-1"></a>

Windows 앱을 EXE 유형으로 서비스 하는 경우 웹 결제 규격을 연동해야 합니다.\
웹 결제 규격 연동 시 회원 인증(로그인)이 필요하므로 이 규격서를 제공합니다.

* 결제 서버 API는 회원 인증(로그인) 시 제공되는 OAuth Token(이하 User Access Token)을 이용합니다.
* 결제 시마다 회원 인증(로그인)을 수행하지 않도록 OAuth 인증을 지원합니다.

## 2.주의사항 <a href="#id-greater-than-apiv7-greater-than-15.-greater-than-2" id="id-greater-than-apiv7-greater-than-15.-greater-than-2"></a>

Embedded Browser(웹뷰)에서 구글 SDK를 적용하지 않고, 구글 Oauth 로그인을 시도하는 경우 403 에러가 발생합니다. \
아래의 방법을 통해 403 에러를 방지할 수 있습니다. &#x20;

* Embedded Browser가 아닌 새 창으로 로그인을 시도합니다.&#x20;
* UserAgent 정보를 수정하여 Embedded Browser가 아닌 웹으로 인식하도록 처리합니다.&#x20;

## 3.회원 인증 플로우 <a href="#id-greater-than-apiv7-greater-than-15.-greater-than-3" id="id-greater-than-apiv7-greater-than-15.-greater-than-3"></a>

### 3.1 Conceptual View <a href="#id-greater-than-apiv7-greater-than-15.-greater-than-3" id="id-greater-than-apiv7-greater-than-15.-greater-than-3"></a>

<figure><img src="/files/VcS2jEouMJsXuwKosi61" alt=""><figcaption></figcaption></figure>

### 3.2 논리 API ↔ 물리 API 규격 매핑 <a href="#id-greater-than-apiv7-greater-than-15.-greater-than-3.2-api-api" id="id-greater-than-apiv7-greater-than-15.-greater-than-3.2-api-api"></a>

Conceptual View'에 표기된 논리 API들이 매핑되는 물리 API 규격은 다음과 같습니다.

<table><thead><tr><th width="81.4444580078125" valign="top">No</th><th width="150.88897705078125" valign="top">Flow</th><th valign="top">논리 API</th><th valign="top">물리 API (연동 규격)</th></tr></thead><tbody><tr><td valign="top">1</td><td valign="top">회원인증</td><td valign="top"><ol><li>Loging UI 요청</li></ol></td><td valign="top">4.2 ONE store 로그인 인증 요청</td></tr><tr><td valign="top">2</td><td valign="top">회원인증</td><td valign="top"><ol start="5"><li>ONEstore UserAccessToken 발급</li></ol></td><td valign="top">4.3 ONE store User Access Token 발급 요청</td></tr></tbody></table>

## 4. ONE store 회원인증 <a href="#id-greater-than-apiv7-greater-than-15.-greater-than-4.onestore" id="id-greater-than-apiv7-greater-than-15.-greater-than-4.onestore"></a>

### 4.1 ONE store 로그인 API 개요 <a href="#id-greater-than-apiv7-greater-than-15.-greater-than-4.1onestore-api" id="id-greater-than-apiv7-greater-than-15.-greater-than-4.1onestore-api"></a>

ONE store 로그인 API는 아래와 같이 구성되어 있습니다.

* ONE store 로그인 인증 요청 API
* 접근 토큰(User Access Token) 발급/삭제 요청 API

ONE store 로그인 인증 요청 API는 개발자 서비스 Web에 ONE store 로그인 화면을 띄우는 API입니다. 사용자가 ONE store 회원 인증에 성공하면 API로부터 받은 임시코드(code) 값을 이용해서 접근 토큰(User Access Token) 발급 요청 API를 호출합니다.

접근 토큰 발급 요청 API를 통해 받은 접근 토큰은 여러가지 Server API들을 호출하는데 사용합니다.

접근 토큰(User Access Token)은 갱신 토큰(Refresh Token)에 비하여 만료기한이 짧으며, 접근 토큰 만료 시 갱신 토큰을 이용하여 새로운 접근 토큰을 발급 받아야 합니다.

토큰 발급 상세 규칙은 '4.1.4 User Access Token 및 Refresh Token 발급 기준'에 명시 되어 있습니다.

#### **4.1.1 표준 응답코드** <a href="#response-code" id="response-code"></a>

<table data-header-hidden><thead><tr><th valign="top"></th><th valign="top"></th><th valign="top"></th><th valign="top"></th><th valign="top"></th><th valign="top"></th></tr></thead><tbody><tr><td valign="top">Code</td><td valign="top">message_ko</td><td valign="top">message_en</td><td valign="top">HTTP Status Code</td><td valign="top">대상API</td><td valign="top">비고</td></tr><tr><td valign="top">Success</td><td valign="top">정상처리 되었습니다.</td><td valign="top">The request has been successfully completed.</td><td valign="top">200 - Success</td><td valign="top">4.4 ONE store User Access Token 삭제 요청<br></td><td valign="top"><br></td></tr><tr><td valign="top">RequiredValueNotExist</td><td valign="top">필수값이 존재하지 않습니다. [ field1, field2, ... ]</td><td valign="top">Request parameters are required. [ field1, field2, ... ]</td><td valign="top">400 - Bad Request</td><td valign="top">공통</td><td valign="top"><br></td></tr><tr><td valign="top">NoSuchData</td><td valign="top">조회된 결과값이 존재하지 않습니다.</td><td valign="top">The requested data could not be found.</td><td valign="top">404 - Not Found</td><td valign="top">단건 조회 API</td><td valign="top"><br></td></tr><tr><td valign="top">ResourceNotFound</td><td valign="top">요청한 자원이 존재하지 않습니다.</td><td valign="top">The requested resource could not be found.</td><td valign="top">404 - Not Found</td><td valign="top">공통</td><td valign="top">요청한 URL 자원이 없는 경우</td></tr><tr><td valign="top">InternalError</td><td valign="top">정의되지 않은 오류가 발생하였습니다.</td><td valign="top">An undefined error has occurred.</td><td valign="top">500 - Internal Server Error</td><td valign="top">공통</td><td valign="top"><br></td></tr><tr><td valign="top">InvalidRequest</td><td valign="top">입력값이 유효하지 않습니다. [ field1, field2, ... ]</td><td valign="top">Request parameters are invalid. [ field1, field2, ... ]</td><td valign="top">400 - Bad Request</td><td valign="top">공통</td><td valign="top"><br></td></tr><tr><td valign="top">UserAccessTokenExpired</td><td valign="top">Access 토큰이 만료되었습니다.</td><td valign="top">User Access Token has expired.</td><td valign="top">401 - Unauthorized</td><td valign="top">공통</td><td valign="top"><p>code 및 UserAccessToken 만료 처리</p><ul><li>만료 기한 초과 시</li><li>회원 상태 변동 시 (휴면/탈퇴/통합)</li><li>TStore ID 회원 패스워드 변경 시</li><li>소셜 인증 실패 시<br>(소셜 연동 정보 변동 - 연결 취소 등)</li></ul></td></tr><tr><td valign="top">InvalidRefreshToken</td><td valign="top">잘못된 Refresh Token 입니다.</td><td valign="top">Invalid refresh token</td><td valign="top">400 - Bad Request</td><td valign="top">공통</td><td valign="top">grant_type : refresh_token 경우</td></tr><tr><td valign="top">ExpiredRefreshToken</td><td valign="top">만료된 Refresh Token 입니다.</td><td valign="top">Invalid refresh token (expired)</td><td valign="top">401 - Unauthorized</td><td valign="top">공통</td><td valign="top">grant_type : refresh_token 경우</td></tr><tr><td valign="top">UnauthorizedAccess</td><td valign="top">해당 API에 접근권한이 없습니다.</td><td valign="top">Not authorized to this API.</td><td valign="top">403 - Fobidden<br></td><td valign="top">공통</td><td valign="top"><br></td></tr><tr><td valign="top">InvalidUserAccessToken</td><td valign="top">Access 토큰이 유효하지 않습니다.</td><td valign="top">User Access Token is invalid.</td><td valign="top">401 - Unauthorized</td><td valign="top">공통</td><td valign="top"><br></td></tr><tr><td valign="top">InvalidAuthorizationParam</td><td valign="top">Authorization Param의 값이 유효하지 않습니다.</td><td valign="top">Authorization param is invalid.</td><td valign="top">400 - Bad Request</td><td valign="top">공통</td><td valign="top"><ul><li>code</li><li>올바르지 않은 code</li></ul></td></tr><tr><td valign="top">MethodNotAllowed</td><td valign="top">지원하지 않는 HTTP Method 입니다.</td><td valign="top">HTTP method not supported.</td><td valign="top">405 - Method Not Allowed</td><td valign="top">공통</td><td valign="top"><br></td></tr><tr><td valign="top">InvalidContentType</td><td valign="top">잘못된 Content Type 입니다.</td><td valign="top">The request content-type is invalid.</td><td valign="top">415 - Unsupported Media Type</td><td valign="top">공통</td><td valign="top"><br></td></tr><tr><td valign="top">UserNotExist</td><td valign="top">회원 정보가 존재하지 않습니다. </td><td valign="top">User does not exist.</td><td valign="top">404 - Not Found</td><td valign="top">공통</td><td valign="top"><br></td></tr><tr><td valign="top">InvalidUser</td><td valign="top">회원 정보가 유효하지 않습니다.</td><td valign="top">User information is not valid.</td><td valign="top">409 - Conflict</td><td valign="top">공통</td><td valign="top"><br></td></tr><tr><td valign="top">UnsupportedResponseType</td><td valign="top"><br></td><td valign="top">Unsupported response types: [field1]</td><td valign="top">400 - Bad Request</td><td valign="top">공통</td><td valign="top"><br></td></tr><tr><td valign="top">WrongApproach</td><td valign="top"><br></td><td valign="top">The wrong approach.</td><td valign="top">403 - Forbidden</td><td valign="top">공통</td><td valign="top"><br></td></tr></tbody></table>

<br>

#### **4.1.2 표준 오류응답**

오류응답인 경우 표준 응답코드에 정의된 코드 및 메시지를 전달합니다.

**Example**

| <p>HTTP/1.1 400 Bad Request<br>Content-type: application/json;charset=UTF-8<br>{<br>    "error" : {<br>        "code" : "NoSuchData",<br>        "message" : "The requested data could not be found."<br>    }<br>}</p> |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

#### **4.1.3 client\_id와 client\_secret**

client\_id와 client\_secret 값은 "개발자센터 > 상품현황 > 앱 상세 > 공통정보 > 라이선스 관리" 메뉴를 통해 확인할 수 있습니다. <br>

#### **4.1.4 User Access Token 및 Refresh Token 발급 기준**

ONE store User Access Token은 Client ID(=게임/앱)와 원스토어 사용자의 회원 ID 기준으로 발급됩니다.&#x20;

* grant\_type : authorization\_code
  * 사용자의 명시적 로그인이기 때문에 기존 token이 유효하지 않아도 신규 발급
  * user\_access\_token, refresh\_token

    * 기존 유효한 (user\_access, refresh) token이 있는 경우 기존 value 응답
    * 기존 유효한 (user\_access, refresh) token이 없는 경우 신규 발급

    <br>
* grant\_type : refresh\_token
  * refresh\_token
    * 유효한 refresh\_token이 없는 경우 오류 응답
    * 유효한 refresh\_token이 있는 경우 만료기한 연장(초기화: 기본 35일)
  * user\_access\_token
    * 기존 유효한 user\_access\_token이 있는 경우 기존 value 응답
    * 기존 유효한 user\_access\_token이 없는 경우 신규 발급\ <br>
* 토큰 삭제 시 refresh\_token, user\_access\_token 함께 삭제 됨

<br>

### 4.2 ONE store 로그인 인증 요청 <a href="#id-greater-than-apiv7-greater-than-15.-greater-than-4.2onestore" id="id-greater-than-apiv7-greater-than-15.-greater-than-4.2onestore"></a>

**\[ API Spec. ]**

<table data-header-hidden><thead><tr><th width="229.5555419921875"></th><th></th><th data-hidden></th><th data-hidden></th></tr></thead><tbody><tr><td><strong>Protocol</strong></td><td>HTTPS</td><td></td><td></td></tr><tr><td><strong>Content-Type</strong></td><td>application/x-www-form-urlencoded</td><td></td><td></td></tr><tr><td><strong>Method</strong></td><td>GET/POST</td><td></td><td></td></tr><tr><td><strong>응답 포맷</strong></td><td>URL Redirect</td><td></td><td></td></tr><tr><td><strong>Path</strong></td><td><p>상용</p><p> - <a href="https://accounts.onestore.net/oauth2.0/authorize">https://accounts.onestore.net/oauth2.0/authorize</a></p><p>개발</p><p> - <a href="https://qa-accounts.onestore.co.net/oauth2.0/authorize">https://qa-accounts.onestore.co.net/oauth2.0/authorize</a></p></td><td></td><td></td></tr><tr><td><strong>Description</strong></td><td><p>ONE store OAuth 이용 시 로그인 페이지</p><p>오류 코드 참고 : <a href="/pages/94RAk6Ysd4G0WyLFrY1k#id-4.1.1">표준 응답코드</a></p></td><td></td><td></td></tr></tbody></table>

**\[ Request ]**

**Parameter**

<table data-header-hidden><thead><tr><th valign="top"></th><th width="100.3333740234375" valign="top"></th><th valign="top"></th><th width="109" valign="top"></th><th valign="top"></th></tr></thead><tbody><tr><td valign="top"><strong>Parameter Name</strong></td><td valign="top"><strong>Type</strong></td><td valign="top"><strong>Description</strong></td><td valign="top"><strong>Required</strong></td><td valign="top"><strong>Remarks</strong></td></tr><tr><td valign="top">response_type</td><td valign="top">String</td><td valign="top">인증 과정에 대한 내부 구분값으로 'code'로 전송해야 함</td><td valign="top">Y</td><td valign="top"><ul><li>code</li></ul></td></tr><tr><td valign="top">client_id</td><td valign="top">String</td><td valign="top">OAuth Client Id</td><td valign="top">Y</td><td valign="top"><ul><li>Android OS Application의 Package Name을 사용</li></ul></td></tr><tr><td valign="top">redirect_uri</td><td valign="top">String</td><td valign="top">등록 시 입력한 Callback URL 값으로 URL 인코딩을 적용한 값</td><td valign="top">Y</td><td valign="top"><ul><li>URL 인코딩</li><li>등록을 위해 별도 요청이 필요합니다. (devhelper@onestore.co.kr)</li></ul></td></tr><tr><td valign="top">state</td><td valign="top">String</td><td valign="top">사이트 간 요청 위조(cross-site request forgery) 공격을 방지하기 위해<br>개발자 측에서 생성한 상태 토큰값으로 URL 인코딩을 적용한 값을 사용</td><td valign="top">Y</td><td valign="top"><ul><li>URL 인코딩</li><li>개발자 측에서 생성/전달. ONE store 측은 넘겨받은 값을 그대로 리턴</li></ul></td></tr><tr><td valign="top">scope</td><td valign="top">String</td><td valign="top">접근 허용 범위를 처리하기 위한 내부 구분값</td><td valign="top">Y</td><td valign="top"><ul><li>user_payment</li></ul></td></tr></tbody></table>

**Header**

<table data-header-hidden><thead><tr><th width="170.4444580078125" valign="top"></th><th width="114.7777099609375" valign="top"></th><th width="307.888916015625" valign="top"></th><th valign="top"></th></tr></thead><tbody><tr><td valign="top"><strong>Parameter Name</strong></td><td valign="top"><strong>Type</strong></td><td valign="top"><strong>Description</strong></td><td valign="top"><strong>Required</strong></td></tr><tr><td valign="top">x-market-code</td><td valign="top">String</td><td valign="top"><p>마켓 구분 코드</p><ul><li>MKT_ONE: 원스토어(대한민국) </li><li>MKT_GLB: 원스토어(대한민국 외)</li></ul></td><td valign="top">Y</td></tr></tbody></table>

**Example**

| <https://accounts.onestore.net/oauth2.0/authorize?response_type=code&client_id=client_id_example&redirect_uri=http%3A%2F%2Fservice.redirect.url%2Fsubpath&state=hLiDdL2uhPtsftcU&scope=user_payment> |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

**\[ Response ]**

* ONE store 로그인 인증 요청 API를 호출 했을 때 사용자가 로그인되지 않은 상태이면 로그인 화면으로 이동합니다.
* 사용자 로그인 완료 후 약관 및 정보 제공 동의 등이 필요한 경우 해당 화면으로 이동합니다.
* 로그인과 동의 과정이 완료되면 콜백 URL에 code값과 state 값이 URL 문자열로 전송됩니다.
* code 값은 접근 토큰(User Access Token) 발급 요청에 사용됩니다.\ <br>

<table data-header-hidden><thead><tr><th width="167.4444580078125" valign="top"></th><th width="108.111083984375" valign="top"></th><th valign="top"></th><th></th></tr></thead><tbody><tr><td valign="top"><strong>Element Name</strong></td><td valign="top"><strong>Type</strong></td><td valign="top"><strong>Description</strong></td><td>Remarks</td></tr><tr><td valign="top">code</td><td valign="top">String</td><td valign="top"><p> - 로그인 인증에 성공하면 반환받는 인증 코드</p><p> - 접근 토큰(User Access Token) 발급에 사용</p></td><td><ul><li>length : 50</li><li>영문 대소문자 및 숫자로 구성</li><li>만료기한 5분</li></ul></td></tr><tr><td valign="top">state<br></td><td valign="top">String</td><td valign="top">사이트 간 요청 위조 공격을 방지하기 위해 개발자 측에서 생성한 상태 토큰</td><td><ul><li>URL 인코딩</li><li>요청 시 넘겨준 값을 그대로 리턴</li></ul></td></tr><tr><td valign="top">error_code</td><td valign="top">String</td><td valign="top">로그인 인증에 실패하면 반환받는 에러 코드</td><td>오류 코드 참고 : <a href="/pages/94RAk6Ysd4G0WyLFrY1k#response-code">표준 응답코드</a></td></tr><tr><td valign="top">error_message</td><td valign="top">String</td><td valign="top"> 로그인 인증에 실패하면 반환받는 에러 메시지</td><td><br></td></tr></tbody></table>

**Example**

| <p>인증 절차 완료 후</p><ul><li>API 요청 성공시 : <http://콜백URL?code={code값}&#x26;state={state값}></li><li>API 요청 실패시 : <http://콜백URL?state={state값}&#x26;error_code={에러코드값}&#x26;error_message={에러메시지}></li></ul> |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

**오류 유형 정리**

<table data-header-hidden><thead><tr><th valign="top"></th><th valign="top"></th><th valign="top"></th><th valign="top"></th><th valign="top"></th></tr></thead><tbody><tr><td valign="top">코드</td><td valign="top">응답 방식</td><td valign="top"><strong>발생 조건</strong></td><td valign="top">전문 (메세지 및 화면내용)</td><td valign="top">기타 설명</td></tr><tr><td valign="top">RequiredValueNotExist</td><td valign="top">PAGE</td><td valign="top">필수값 누락<br>- response_type<br>- client_id<br>- state<br>- scope<br>- redirect_uri</td><td valign="top">Request parameters are required. [ {누락 파라미터} ]</td><td valign="top"><br></td></tr><tr><td valign="top">UnsupportedResponseType</td><td valign="top">REDIRECTION</td><td valign="top">파라미터 유효성<br>- response_type ≠ code</td><td valign="top">{redirect_uri}?error_code=UnsupportedResponseType&#x26;error_message=Unsupported response types: [{response_type}]</td><td valign="top"><br></td></tr><tr><td valign="top">InvalidRequest</td><td valign="top">PAGE</td><td valign="top">파라미터 유효성<br>- 미발급 client_id</td><td valign="top">Request parameters are invalid. [ client_id ]</td><td valign="top"><br></td></tr><tr><td valign="top">InvalidRedirect</td><td valign="top">PAGE</td><td valign="top">파라미터 유효성<br>- 미등록 redirect_uri</td><td valign="top">Invalid redirect</td><td valign="top"><br></td></tr><tr><td valign="top">InvalidScope</td><td valign="top">REDIRECTION</td><td valign="top">파라미터 유효성<br>- scope ≠ user_payment</td><td valign="top">{redirect_uri}?error_code=InvalidScope&#x26;error_message=Invalid scope</td><td valign="top">접속 후 인증 요청 시 발생</td></tr><tr><td valign="top">WrongApproach</td><td valign="top">PAGE</td><td valign="top">로그인 URI 직접 접근</td><td valign="top">The wrong approach.</td><td valign="top">/oauth2.0/login 직접 접근</td></tr></tbody></table>

<br>

### 4.3 ONE store User Access Token 발급 요청 <a href="#id-greater-than-apiv7-greater-than-15.-greater-than-4.3onestoreuseraccesstoken" id="id-greater-than-apiv7-greater-than-15.-greater-than-4.3onestoreuseraccesstoken"></a>

**\[ API Spec. ]**

<table data-header-hidden><thead><tr><th width="217.33331298828125" valign="top"></th><th valign="top"></th><th data-hidden valign="top"></th><th data-hidden valign="top"></th></tr></thead><tbody><tr><td valign="top"><strong>Protocol</strong></td><td valign="top">HTTPS</td><td valign="top"></td><td valign="top"></td></tr><tr><td valign="top"><strong>Content-Type</strong></td><td valign="top">application/x-www-form-urlencoded</td><td valign="top"></td><td valign="top"></td></tr><tr><td valign="top"><strong>Method</strong></td><td valign="top">POST</td><td valign="top"></td><td valign="top"></td></tr><tr><td valign="top"><strong>응답 포맷</strong></td><td valign="top">application/json</td><td valign="top"></td><td valign="top"></td></tr><tr><td valign="top"><strong>Path</strong></td><td valign="top"><p>상용</p><p> - <a href="https://accounts.onestore.net/oauth2.0/token">https://accounts.onestore.net/oauth2.0/token</a></p></td><td valign="top"></td><td valign="top"></td></tr><tr><td valign="top"><strong>Description</strong></td><td valign="top"><ul><li>ONE store User Access Token 발급</li><li>오류 코드 참고 : <a href="/pages/94RAk6Ysd4G0WyLFrY1k#id-4.1.1">표준 응답코드</a></li></ul></td><td valign="top"></td><td valign="top"></td></tr></tbody></table>

**\[ Request ]**

**Parameter**

<table data-header-hidden><thead><tr><th width="161" valign="top"></th><th width="113.77783203125" valign="top"></th><th valign="top"></th><th width="111.22216796875" valign="top"></th><th valign="top"></th></tr></thead><tbody><tr><td valign="top"><strong>Parameter Name</strong></td><td valign="top"><strong>Type</strong></td><td valign="top"><strong>Description</strong></td><td valign="top"><strong>Required</strong></td><td valign="top"><strong>Remarks</strong></td></tr><tr><td valign="top">grant_type</td><td valign="top">String</td><td valign="top">접근 토큰 발급 방식에 대한 구분값</td><td valign="top">Y</td><td valign="top"><ul><li>'authorization_code'</li><li>'refresh_token'</li><li>그 외 발급 방식 현재 미정</li></ul></td></tr><tr><td valign="top">client_id</td><td valign="top">String</td><td valign="top">OAuth Client Id</td><td valign="top">Y</td><td valign="top">Android OS Application의 Package Name을 사용</td></tr><tr><td valign="top">client_secret<br></td><td valign="top">String</td><td valign="top">OAuth Client Secret</td><td valign="top">Y</td><td valign="top">ONE store 개발자센터에서 발급한 Client secret 값을 사용</td></tr><tr><td valign="top">code<br></td><td valign="top">String</td><td valign="top">로그인 인증 요청 API 호출에 성공하고 응답 받은 인증코드값 (code)<br></td><td valign="top">N</td><td valign="top">grant_type : authorization_code 경우 필수값</td></tr><tr><td valign="top">refresh_token</td><td valign="top">String</td><td valign="top">User Access Token 발급 시 함께 발급받은 refresh_token 값</td><td valign="top">N</td><td valign="top">grant_type : refresh_token 경우 필수값</td></tr><tr><td valign="top">state<br></td><td valign="top">String</td><td valign="top">사이트 간 요청 위조(cross-site request forgery) 공격을 방지하기 위해<br>개발자 측에서 생성한 상태 토큰값으로 URL 인코딩을 적용한 값을 사용<br></td><td valign="top">Y</td><td valign="top"><ul><li>URL 인코딩</li><li>개발자 측에서 생성/전달, ONE store 측은 넘겨받은 값을 그대로 리턴 함<br></li></ul></td></tr></tbody></table>

**Header**

<table data-header-hidden><thead><tr><th width="192.33331298828125" valign="top"></th><th width="138.111083984375" valign="top"></th><th valign="top"></th><th width="151.666748046875" valign="top"></th></tr></thead><tbody><tr><td valign="top"><strong>Parameter Name</strong></td><td valign="top"><strong>Type</strong></td><td valign="top"><strong>Description</strong></td><td valign="top"><strong>Required</strong></td></tr><tr><td valign="top">x-market-code</td><td valign="top">String</td><td valign="top"><p>마켓 구분 코드</p><ul><li>MKT_ONE: 원스토어(대한민국) </li><li>MKT_GLB: 원스토어(대한민국 외)</li></ul></td><td valign="top">Y</td></tr></tbody></table>

**Example**

| <p>POST /oauth2.0/token HTTP/1.1 Host: <a href="http://accounts.onestore.net/">accounts.onestore.net</a> Content-Type: application/x-www-form-urlencoded x-market-code:MKT\_ONE</p><p>grant\_type : authorization\_code의 경우<br>grant\_type=authorization\_code&<br>code=EIc5bFrl4RibFls1&<br>client\_id=client\_id\_example&<br>client\_secret=hDBmMRhz7eJRsM9Z2q1oFBSe&<br>state=9kgsGTfH4j7IyAkg</p><p>grant\_type : refresh\_token의 경우<br>grant\_type=refresh\_token&<br>refresh\_token=EIc5bFrl4RibFls1&<br>client\_id=client\_id\_example&<br>client\_secret=hDBmMRhz7eJRsM9Z2q1oFBSe&<br>state=9kgsGTfH4j7IyAkg</p> |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

**\[ Response ]**

<table data-header-hidden><thead><tr><th width="180.5555419921875" valign="top"></th><th width="101.4444580078125" valign="top"></th><th valign="top"></th><th valign="top"></th></tr></thead><tbody><tr><td valign="top"><strong>Element Name</strong></td><td valign="top"><strong>Type</strong></td><td valign="top"><strong>Description</strong></td><td valign="top">Remarks</td></tr><tr><td valign="top">user_access_token<br></td><td valign="top">String</td><td valign="top">ONE store 접근 토큰(User Access Token)</td><td valign="top"><ul><li>max length : 255</li><li>만료기한 10분</li></ul></td></tr><tr><td valign="top">refresh_token</td><td valign="top">String</td><td valign="top">User Access Token에 대한 Refresh 토큰</td><td valign="top"><ul><li>max length : 255</li><li>기본 만료기한 35일, 사용 시 만료기한 연장(초기화)</li></ul></td></tr><tr><td valign="top">token_type</td><td valign="top">String</td><td valign="top">Bearer</td><td valign="top"><br></td></tr><tr><td valign="top">expires_in</td><td valign="top">integer</td><td valign="top">접근 토큰의 유효 기간(초 단위)</td><td valign="top"><br></td></tr><tr><td valign="top">state</td><td valign="top">String</td><td valign="top">사이트 간 요청 위조 공격을 방지하기 위해 개발자 측에서 생성한 상태 토큰</td><td valign="top"><ul><li>URL 인코딩<br></li><li>요청 시 넘겨준 값을 그대로 리턴</li><li>성공 시에만 포함됨</li></ul></td></tr><tr><td valign="top">error <br></td><td valign="top">Object</td><td valign="top">error 발생 시에만 포함</td><td valign="top">오류 코드 참고 : <a href="/pages/94RAk6Ysd4G0WyLFrY1k#id-4.1.1">표준 응답코드</a></td></tr><tr><td valign="top">code</td><td valign="top">String</td><td valign="top">에러 코드</td><td valign="top"><br></td></tr><tr><td valign="top">message</td><td valign="top">String</td><td valign="top">에러 메세지</td><td valign="top"><br></td></tr></tbody></table>

**Example**

<table data-header-hidden><thead><tr><th></th></tr></thead><tbody><tr><td><p>// 성공 시</p><pre><code>{
  "user_access_token" : "f27d2c49-231d-4848-9e8c-ec9a1fef9c35",
  "refresh_token" : "1fe54c5f-60d1-4fbb-a412-929c84adab43",
  "token_type" : "Bearer",
  "expires_in" : 603389,
  "state" : "hLiDdL2uhPtsftcU"
}
</code></pre><p></p><p>// 실패 시</p><pre><code>{
    "error" : {
        "code" : "InvalidAuthorizationParam",
        "message" : "Authorization param is invalid."
    }
}
</code></pre></td></tr></tbody></table>

**오류 유형 정리**

<table data-header-hidden><thead><tr><th valign="top"></th><th valign="top"></th><th valign="top"></th><th valign="top"></th></tr></thead><tbody><tr><td valign="top"><strong>코드</strong></td><td valign="top"><strong>발생 조건</strong></td><td valign="top"><strong>전문 (json)</strong></td><td valign="top"><strong>기타 설명</strong></td></tr><tr><td valign="top">RequiredValueNotExist</td><td valign="top">필수값 누락<br>- grant_type<br>- client_id<br>- client_secret<br>- code (선택적 필수값)<br>- refresh_token (선택적 필수값)<br>- state</td><td valign="top">{<br>    "error": {<br>        "code": "RequiredValueNotExist",<br>        "message": "Request parameters are required. ({누락파라미터})"<br>    }<br>}</td><td valign="top">- code : grant_type : authorization_code 경우 필수값<br>- refresh_token : grant_type : refresh_token 경우 필수값</td></tr><tr><td valign="top">InvalidRequest</td><td valign="top">파라미터 유효성<br>- grant_type ≠ (authorization_code or refresh_token)</td><td valign="top">{<br>    "error": {<br>        "code": "InvalidRequest",<br>        "message": "Request parameters are invalid. [ grant_type ]"<br>    }<br>}</td><td valign="top"><br></td></tr><tr><td valign="top">InvalidAuthorizationParam</td><td valign="top">파라미터 유효성<br>- 미발급 code</td><td valign="top">{<br>    "error": {<br>        "code": "InvalidAuthorizationParam",<br>        "message": "Authorization param is invalid."<br>    }<br>}</td><td valign="top"><br></td></tr><tr><td valign="top">InvalidRequest</td><td valign="top">파라미터 유효성<br>- 미발급 client_id</td><td valign="top">{<br>    "error": {<br>        "code": "InvalidRequest",<br>        "message": "Request parameters are invalid. [ client_id or client_secret ]"<br>    }<br>}</td><td valign="top"><br></td></tr><tr><td valign="top">InvalidRequest</td><td valign="top">파라미터 유효성<br>- 미발급 client_secret</td><td valign="top">{<br>    "error": {<br>        "code": "InvalidRequest",<br>        "message": "Request parameters are invalid. [ client_id or client_secret ]"<br>    }<br>}</td><td valign="top"><br></td></tr><tr><td valign="top">InvalidRefreshToken</td><td valign="top">파라미터 유효성<br>- 미발급 refresh_token</td><td valign="top">{<br>    "error": {<br>        "code": "InvalidRefreshToken",<br>        "message": "Invalid refresh token"<br>    }<br>}</td><td valign="top">grant_type : refresh_token 경우</td></tr><tr><td valign="top">ExpiredRefreshToken</td><td valign="top">파라미터 유효성<br>- 만료 refresh_token</td><td valign="top">{<br>    "error": {<br>        "code": "ExpiredRefreshToken",<br>        "message": "Invalid refresh token (expired)"<br>    }<br>}</td><td valign="top">grant_type : refresh_token 경우</td></tr></tbody></table>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://onestore-dev.gitbook.io/dev/tools/billing/v21/web-payment/member.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
