Documentation Index
Fetch the complete documentation index at: https://generaltranslation.mintlify.app/llms.txt
Use this file to discover all available pages before exploring further.
이 문서의 목적은 X API에 권한이 부여된 요청을 보내기 위해 HTTP 요청을 어떻게 수정해야 하는지 설명하는 것입니다.
X의 모든 API는 HTTP 프로토콜을 기반으로 합니다. 이는 X API를 사용하는 소프트웨어가 모두 X의 서버로 일련의 구조화된 메시지를 전송한다는 뜻입니다. 예를 들어, 텍스트 “Hello Ladies + Gentlemen, a signed OAuth request!”를 Tweet으로 게시하기 위한 요청은 다음과 비슷한 형태가 됩니다:
POST /1.1/statuses/update.json?include_entities=true HTTP/1.1
Accept: */*
Connection: close
User-Agent: OAuth gem v0.4.4
Content-Type: application/x-www-form-urlencoded
Content-Length: 76
Host: api.x.com
status=Hello%20Ladies%20%2b%20Gentlemen%2c%20a%20signed%20OAuth%20request%21
어떤 HTTP 라이브러리든 위 요청을 큰 어려움 없이 생성하고 전송할 수 있습니다. 그러나 다음과 같은 점들을 알 수 없기 때문에 위 요청은 유효하지 않은 것으로 간주됩니다.
- 어떤 애플리케이션이 요청을 보내고 있는지
- 어떤 사용자를 대신해 요청이 게시되고 있는지
- 해당 사용자가 애플리케이션이 자신을 대신해 게시하도록 권한을 부여했는지
- 전송 중에 제3자에 의해 요청이 변조되었는지
애플리케이션이 이 정보를 제공할 수 있도록, X의 API는 OAuth 1.0a protocol을 사용합니다. 매우 단순화해서 말하면, X의 구현에서는 인가가 필요한 요청에 위의 질문에 답할 수 있을 만큼의 정보를 담은 추가 HTTP Authorization 헤더를 포함해야 합니다. 위의 HTTP 요청에 이 헤더를 포함하도록 수정한 버전은 다음과 같습니다(일반적으로 Authorization 헤더는 한 줄에 있어야 하지만, 여기서는 가독성을 위해 줄바꿈을 했습니다).
POST /1.1/statuses/update.json?include_entities=true HTTP/1.1
Accept: */*
Connection: close
User-Agent: OAuth gem v0.4.4
Content-Type: application/x-www-form-urlencoded
Authorization:
OAuth oauth\_consumer\_key="xvz1evFS4wEEPTGEFPHBog",
oauth_nonce="kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg",
oauth_signature="tnnArxj06cWHq44gCs1OSKk%2FjLY%3D",
oauth\_signature\_method="HMAC-SHA1",
oauth_timestamp="1318622958",
oauth_token="370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb",
oauth_version="1.0"
Content-Length: 76
Host: api.x.com
status=Hello%20Ladies%20%2b%20Gentlemen%2c%20a%20signed%20OAuth%20request%21
이 요청이 생성되었을 당시에는 X API가 이 요청을 유효한 것으로 받아들였을 것입니다.
이 서명 과정이 통합 범위를 넘어선다고 느껴진다면, OAuth를 사용하지 않고도 X API와 상호작용할 수 있는 Web Intents 사용을 고려해 보세요.
매개변수 수집하기
헤더에 키/값 쌍이 7개 있으며, 모든 키가 문자열 “oauth_”로 시작한다는 것을 확인할 수 있어야 합니다. 특정 X API 요청에 대해 이 7개 값을 수집하고 이와 비슷한 헤더를 생성하면, 해당 요청에 대한 인증 정보를 지정할 수 있습니다. 각 값이 어떻게 생성되는지는 아래에 설명되어 있습니다.
Consumer key
oauth_consumer_key는 어떤 애플리케이션이 요청을 보내는지 식별합니다. 이 값은 개발자 콘솔 내 X 앱의 설정 페이지에서 가져올 수 있습니다.
| |
|---|
| oauth_consumer_key | xvz1evFS4wEEPTGEFPHBog |
Nonce
oauth_nonce 매개변수는 애플리케이션이 각 고유 요청마다 생성해야 하는 고유 토큰입니다. X는 이 값을 사용해 요청이 여러 번 제출되었는지 여부를 판단합니다. 이 예시에서 사용된 값은 32바이트의 임의 데이터를 Base64로 인코딩한 뒤, 단어 문자가 아닌 모든 문자를 제거하여 생성되었습니다. 이와 같이 비교적 무작위에 가까운 영숫자 문자열을 생성할 수 있는 방식이라면 어떤 접근법이든 괜찮습니다.
| |
|---|
| oauth_nonce | kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg |
Signature
oauth_signature 매개변수에는 다른 모든 요청 매개변수와 두 개의 비밀 값을 서명 알고리즘에 통과시켜 생성된 값이 포함됩니다. 이 서명의 목적은 X가 전송 중에 요청이 수정되지 않았는지 확인하고, 요청을 보내는 애플리케이션을 검증하며, 해당 애플리케이션이 사용자의 계정과 상호작용할 수 있는 권한을 가지고 있는지 검증할 수 있도록 하기 위함입니다.
이 요청에 대한 oauth_signature 계산 과정은 서명 생성에 설명되어 있습니다.
| |
|---|
| oauth_signature | tnnArxj06cWHq44gCs1OSKk/jLY= |
Signature method
X에서 사용하는 oauth_signature_method는 HMAC-SHA1입니다. 이 값은 X API로 전송되는 모든 인가된 요청에 사용해야 합니다.
| |
|---|
| oauth_signature_method | HMAC-SHA1 |
Timestamp
oauth_timestamp 매개변수는 요청이 생성된 시점을 나타냅니다. 이 값은 요청이 생성되는 시점 기준으로 Unix epoch 이후 경과한 초 수여야 하며, 대부분의 프로그래밍 언어에서 쉽게 생성할 수 있습니다. X는 너무 오래 전에 생성된 요청을 거부하므로, 요청을 생성하는 컴퓨터의 시계를 NTP와 동기화해 두는 것이 중요합니다.
| |
|---|
| oauth_timestamp | 1318622958 |
Token
oauth_token 매개변수는 일반적으로 사용자가 자신의 계정에 대한 액세스 권한을 애플리케이션과 공유하도록 허용했다는 것을 나타냅니다. 이 값이 전달되지 않거나 다른 형태의 토큰이 사용되는 몇 가지 인증 요청이 있으며, 이에 대해서는 액세스 토큰 가져오기에서 자세히 다룹니다. 대부분의 범용 요청에서는 액세스 토큰(access token) 을 사용하게 됩니다.
개발자 콘솔의 X App 설정 페이지에서 계정에 대한 유효한 액세스 토큰을 생성할 수 있습니다.
| |
|---|
| oauth_token | 370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb |
Version
oauth_version 매개변수는 X API로 전송되는 모든 요청에서 항상 1.0이어야 합니다.
헤더 문자열을 구성하려면, DST라는 이름의 문자열에 기록한다고 가정합니다.
- 문자열 “OAuth ” (끝의 공백 포함)을 DST에 추가합니다.
- 위에 나열된 7개의 매개변수에 대한 각 키/값 쌍에 대해:
- 키를 퍼센트 인코딩한 뒤 DST에 추가합니다.
- 등호 문자 ’=‘를 DST에 추가합니다.
- 큰따옴표 문자 ’“‘를 DST에 추가합니다.
- 값을 퍼센트 인코딩한 뒤 DST에 추가합니다.
- 큰따옴표 문자 ’“‘를 DST에 추가합니다.
- 남은 키/값 쌍이 있다면, 쉼표 ’,‘와 공백 ’ ‘을 DST에 추가합니다.
이 문자열을 구성할 때 값의 퍼센트 인코딩에 특히 주의해야 합니다. 예를 들어, oauth_signature 값 tnnArxj06cWHq44gCs1OSKk/jLY= 는 반드시 tnnArxj06cWHq44gCs1OSKk%2FjLY%3D 로 인코딩되어야 합니다.
위에서 수집한 매개변수에 이 단계를 적용하면 다음과 같은 문자열이 생성됩니다:
OAuth oauth\_consumer\_key="xvz1evFS4wEEPTGEFPHBog", oauth\_nonce="kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg", oauth\_signature="tnnArxj06cWHq44gCs1OSKk%2FjLY%3D", oauth\_signature\_method="HMAC-SHA1", oauth\_timestamp="1318622958", oauth\_token="370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb", oauth_version="1.0"
이 값을 요청의 Authorization 헤더 값으로 설정해야 합니다.