메인 콘텐츠로 건너뛰기

요청 승인하기

이 문서는 X API에 승인된 요청을 보내기 위해 HTTP 요청을 수정하는 방법을 설명합니다. X의 모든 API는 HTTP 프로토콜을 기반으로 합니다. 즉, X의 API를 사용하는 여러분이 작성한 소프트웨어는 X의 서버로 일련의 구조화된 메시지를 전송합니다. 예를 들어, 텍스트 “Hello Ladies + Gentlemen, a signed OAuth request!”를 게시물로 게시하는 요청은 대략 다음과 같이 보입니다:
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 라이브러리든 큰 어려움 없이 위의 요청을 생성해 전송할 수 있습니다. 그러나 다음 사항을 확인할 방법이 없으므로 위의 요청은 유효하지 않은 것으로 간주됩니다.
  1. 어떤 애플리케이션이 요청을 보냈는지
  2. 요청이 어느 사용자를 대신해 게시를 수행하는지
  3. 사용자가 애플리케이션에 자신의 대신 게시할 권한을 부여했는지
  4. 전송 중 제3자에 의해 요청이 변조되지 않았는지
애플리케이션이 이 정보를 제공할 수 있도록 X의 API는 OAuth 1.0a 프로토콜을 사용합니다. 간단히 말해, 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 app 설정 페이지로 이동하여 이 값을 확인하세요.
oauth_consumer_keyxvz1evFS4wEEPTGEFPHBog
Nonce oauth_nonce 매개변수는 애플리케이션이 각 고유 요청마다 생성해야 하는 고유 토큰입니다. X는 이 값을 사용해 동일한 요청이 여러 번 제출되었는지 여부를 판별합니다. 이 요청의 값은 32바이트의 임의 데이터를 base64로 인코딩한 뒤, 단어 문자가 아닌 모든 문자를 제거하여 생성되었습니다. 비교적 무작위의 영숫자 문자열을 생성하는 방법이라면 어떤 방식이든 괜찮습니다.
oauth_noncekYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg
Signature oauth_signature 매개변수에는 다른 모든 요청 매개변수와 두 개의 비밀 값을 서명 알고리즘으로 처리해 생성한 값이 포함됩니다. 서명의 목적은 전송 중 요청이 변경되지 않았는지 검증하고, 요청을 보내는 애플리케이션을 확인하며, 해당 애플리케이션이 사용자의 계정과 상호작용할 권한을 갖고 있음을 확인하기 위함입니다. 이 요청의 oauth_signature 계산 절차는 서명 생성에 설명되어 있습니다.
oauth_signaturetnnArxj06cWHq44gCs1OSKk/jLY=
서명 방법 X에서 사용하는 oauth_signature_method는 HMAC-SHA1입니다. 이 값은 X의 API로 전송되는 모든 승인된 요청에 사용해야 합니다.
oauth_signature_methodHMAC-SHA1
타임스탬프 oauth_timestamp 매개변수는 요청이 생성된 시점을 나타냅니다. 이 값은 요청 생성 시점의 Unix epoch 이후 경과한 초 단위여야 하며, 대부분의 프로그래밍 언어에서 쉽게 생성할 수 있습니다. X는 너무 과거에 생성된 요청을 거부하므로, 요청을 생성하는 컴퓨터의 시계를 NTP와 동기화하는 것이 중요합니다.
oauth_timestamp1318622958
토큰 oauth_token 매개변수는 일반적으로 사용자가 애플리케이션에 자신의 계정 액세스를 공유하도록 부여한 권한을 나타냅니다. 이 값이 전달되지 않거나 다른 형태의 토큰이 사용되는 몇 가지 인증 요청도 있으나, 이에 대해서는 액세스 토큰 획득에서 자세히 다룹니다. 대부분의 일반적인 요청에서는 통상적으로 ‘액세스 토큰’을 사용합니다. 개발자 포털X 앱 설정 페이지에서 계정에 대한 유효한 액세스 토큰을 생성할 수 있습니다.
oauth_token370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb
버전 oauth_version 매개변수는 X API로 전송되는 모든 요청에서 항상 1.0이어야 합니다.
oauth_version1.0

헤더 문자열 구성

헤더 문자열을 구성하려면 DST라는 문자열에 작성한다고 가정합니다.
  1. 문자열 “OAuth ”(끝의 공백 포함)를 DST에 추가합니다.
  2. 위에 나열된 7개 매개변수의 각 키/값 쌍에 대해:
    1. 키를 퍼센트 인코딩하고 DST에 추가합니다.
    2. 등호 문자 ‘=’를 DST에 추가합니다.
    3. 큰따옴표 ‘”’를 DST에 추가합니다.
    4. 값을 퍼센트 인코딩하고 DST에 추가합니다.
    5. 큰따옴표 ‘”’를 DST에 추가합니다.
    6. 남은 키/값 쌍이 있다면 쉼표 ‘,’와 공백 ‘ ’을 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 헤더에 설정해야 합니다.