The OAuth 1.0 Protocol draft-hammer-oauth-10
From Wiki - FRENDS.KR
Contents |
이 페이지는 FRENDS 에 의해서 번역된 문서입니다.
참여자 : rhio.kim
- http://tools.ietf.org/html/draft-hammer-oauth-10 원문
- http://openid-foundation-japan.github.com/draft-hammer-oauth-10.html 일본
- Network Working Group E. Hammer-Lahav, Ed.
- Internet-Draft February 5, 2010
- Intended status: Informational
- Expires: August 9, 2010
Abstract
OAuth는 리소스 소유자(다른 클라이언트와 앤드 유저와 같은)를 대신하여 서버 리소스에 액세스하는 방법을 고객에게 제공하는 것이다. 또한 리다 이렉션을 사용하면 최종 사용자는 클라이언트의 보안 카드를(일반적인 사용자 이름과 암호) 공유하지 않고 서버 리소스에 대한 타사 액세스를 유효하게 할 수 있다.
Status of this Memo
This Internet-Draft is submitted to IETF in full conformance with the provisions of BCP 78 and BCP 79.
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF), its areas, and its working groups. Note that other groups may also distribute working documents as Internet-Drafts.
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."
The list of current Internet-Drafts can be accessed at http://www.ietf.org/ietf/1id-abstracts.txt
The list of Internet-Draft Shadow Directories can be accessed at http://www.ietf.org/shadow.html
This Internet-Draft will expire on August 9, 2010.
Copyright Notice
Copyright (c) 2010 IETF Trust and the persons identified as the document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the BSD License.
개요
OAuth 프로토콜은 보호된 리소스에 대한 접근 권한을 제 3자에게 양도하는 경우 일반적인 문제에 대한 해결 방법을 필요로 하는 다양한 웹 사이트와 인터넷 서비스 개발자로 이루어진 커뮤니티에서 태어났다. 그런 OAuth는 2007년 10월 안정 버전 version 1.0 이 되어, 2009년 9월 개정된 [OAuth Core 1.0 Revision A]가 되었다.
이 사양은 개정판 [OAuth Core 1.0 Revision A]를 OAuth 1.0으로 취급하고, 대폭적인 문서의 명료화와 동시에 개정 후 지적 되었던 오탈자 수정도 하고있다. 이 사양의 공개는 원 작업자인 커뮤니티에서 변경 제어권을 IETF로 이관됨을 나타낸다.
기존의 클라이언트-서버 인증 모델은 서버의 리소스에 접근하기 위해 클라이언트가 자신의 인증 정보를 이용한다. 분산된 웹 서비스와 클라우드 컴퓨팅의 이용 확대로 인해 점점 더 많은 서드 파티 애플리케이션이 서버 리소스에 대한 액세스 권한을 필요로 하게된다.
OAuth는 기존의 클라이언트-서버 인증 모델과 함께 세번째 역할 "리소스 소유자"를 소개한다. OAuth 모델에서 클라이언트(리소스 소유자는 아니지만, 자원 소유자를 대신하여 행동)는 리소스 소유자를 관리하면서 서버에 호스팅 되는 리소스에 대한 액세스 권한을 요구한다. 서버 리소스 소유자의 승인 정보와 동시에 요청자가 클라이언트의 신원을 확인할 수 있다.
OAuth는 클라이언트가 리소스 소유자 (다른 클라이언트와 최종 사용자 등)를 대신하여 서버 리소스에 접근하는 방법을 제공한다. 또한 최종 사용자가 자신의 자격 증명 (일반적 예 : 사용자 이름 및 암호)을 공유하지 않고 자신의 서버 리소스에 대한 접근을 허용하는 일련의 과정도 제공한다. 이 프로세스는 사용자 에이전트의 리디렉션을 이용한다.
예를 들어, 사용자 (리소스 소유자)가 인쇄 서비스(고객)에 자신이 사진 공유 서비스 (서버)에 보유하는 개인 사진에 대한 액세스 권한을 부여할 것을 생각한다. 여기에 사용자 이름과 암호는 프린트 서비스가 제시하지 않는다.
대신 사용자는 사진 공유 서비스에서 직접 인증, 사진 공유 서비스 인쇄 서비스에 대한 위임 전용(delegation-specific) 사용자 인증서를 발급한다.
리소스 접근하기 위해 클라이언트는 먼저 리소스 소유자의 허가를 받을 필요가 있다. 이 권한 정보는 토큰과 공유 키의 형태로 나타난다. 토큰의 목적은 리소스 소유자가 클라이언트에게 자신의 인증 정보를 공유할 필요가 없도록 하기 위해서이다. 리소스 소유자의 인증 정보와 달리 토큰은 제한적인 용도와 만료기간을 게시할 수 있으며, 개별적으로 삭제할 수 있다.
이 사양은 2 개의 부분으로 구성된다. 전반 부분은 최종 사용자가 클라이언트에 의해 리소스 접근를 허용하는 경우에, 리다이렉션 기반 사용자 에이전트 프로세스를 정의한다. 후반부에서는 2 세트 보안 카드를 사용하여 인증된 HTTP [RFC2616] 요청을 하는 방법을 정의한다. 이 2 세트 보안 카드는 1 개의 요청을 하는 클라이언트를 식별하는 데 사용되고, 다른 1 개는 그 요청에 클라이언트가 소개되는 리소스 소유자를 식별하기 위해 사용된다.
OAuth [RFC2616] 이외의 전송 프로토콜 사용 방법에 대해 정의되지 않는다.
용어 정의
- 클라이언트(client)
- OAuth 인증 요청 ( Section 3 ) 발급 가능한 HTTP 클라이언트 ( [RFC2616] 참조)
- 서버(server)
- OAuth 인증 요청 ( Section 3 ) 을 수용 가능한 HTTP 서버 ( [RFC2616] 참조)
- 보호된 리소스(protected resource)
- 접근 제한적인 리소스에 OAuth 인증 요청 ( Section 3 ) 을 사용하여 얻을 수 있는 것.
- 리소스 보호자(resource owner)
- 서버에 자신의 인증 정보를 사용하여 인증하고 보호되는 리소스에 대한 접근 및 제어 할 것들.
- 보안 카드(credentials)
- 여기서 말하는 보안 카드는 고유 식별자로 공유 키 쌍을 가리킨다. OAuth는 "클라이언트" "임시" "토큰"의 3 종류의 자격 증명을 정의 : 요청하는 클라이언트의 식별 및 인증, 인증 요청 권한 전달 시에 각각 사용된다.
- 토큰(token)
- 서버가 발급하는 고유 식별자입니다. 클라이언트가 인증 요청을 수행하거나 허가된 리소스 소유자와 인증된 요청을 연결하기 위하여 토큰을 이용한다. 토큰은 공유 키가 세트로 되어 있으며, 클라이언트는 토큰 소유권 및 자원 소유자의 대리권을 증명하기 위하여 공유 키를 사용한다.
- authority to represent the resource owner.
- 기존의 커뮤니티 스펙은 다소 다른 용어가 사용되었다. 그들은 이 사양을 아래와 같이 표기한다. (왼쪽이 기존 사양)
- Consumer - client (클라이언트)
- Service Provider - server (서버)
- User - resource owner (리소스 소유자)
- Consumer Key and Secret - client credentials (클라이언트 보안 카드)
- Request Token and Secret - temporary credentials (임시 보안 카드)
- Access Token and Secret - token credentials (토큰 보안 카드)
예제
Jane (리소스 소유자)가 사진 공유 사이트 'photos.example.net'(서버)에 휴가 사진(보호된 리소스)을 업로드 하는 것으로 한다. 그녀는 'printer.example.com'(클라이언트)를 사용하여 사진을 현상하고 싶다. 보통 경우 Jane은 'photos.example.net' 사용자 이름과 암호를 사용하여 로그인 해야한다.
그러나, Jane은 사진을 출력하기 위한 것이지만 'printer.example.com'에 대해 사용자 이름과 암호를 공유하고 싶지 않았다. 그래서 'printer.example.com'은 사용자에게 더 나은 서비스를 제공하기 위해 이미 'photos.example.net'에서 제공하는 클라이언트 보안 카드를 보유하고 있다.
- Client Identifier (클라이언트 식별자)
- dpf43f3p2l4k3l03
- Client Shared-Secret (클라인트 공유 키)
- kd94hf93k423kf44
'printer.example.com'또 'photos.example.net'의 API 문서에 나와 있는 HMAC-SHA1 서명 방식을 이용한 프로토콜 엔드 포인트를 사용하도록 응용 프로그램을 설정한 것이다.
- Temporary Credential Request (임시 보안 카드 요청)
- https://photos.example.net/initiate
- Resource Owner Authorization URI (리소스 소유자 인증 URI)
- https://photos.example.net/authorize
- Token Request URI(토큰 요청 URI)
- https://photos.example.net/token
'printer.example.com'이 Jane 사진에 대한 액세스 권한을 요청하려면 먼저 대리인의 요청을 승인하기 위해 'photos.example.net'에 대해 임시 보안 카드 발행 요청을 해야 한다. 이렇게 클라이언트가 아래와 같이 HTTPS [RFC2818] 요청을 서버로 전송한다.
POST /initiate HTTP/1.1 Host: photos.example.net Authorization: OAuth realm="Photos", oauth_consumer_key="dpf43f3p2l4k3l03", oauth_signature_method="HMAC-SHA1", oauth_timestamp="137131200", oauth_nonce="wIjqoS", oauth_callback="http%3A%2F%2Fprinter.example.com%2Fready", oauth_signature="74KNZJeDHnMBp0EMJ9ZHt%2FXKycU%3D"
서버가 요청의 유효성을 검사하고 HTTP 응답 본문에 임시 보안 카드를 갖게 한 응답이다.
HTTP/1.1 200 OK Content-Type: application/x-www-form-urlencoded oauth_token=hh5s93j4hdidpola&oauth_token_secret=hdhd0244k9j7ao03& oauth_callback_confirmed=true
클라이언트는 Jane 에게 그녀의 개인적인 사진에 대한 접근을 승인, 그녀의 사용자 에이전트 서버 리소스 소유자인가 엔드 포인트로 리디렉션합니다.
https://photos.example.net/authorize?oauth_token=hh5s93j4hdidpola
서버는 Jane 에게 사용자 이름과 암호를 사용하는 로그인을 요구하고 성공하는 경우는 'printer.example.com'이 사진에 접근하기 위해 그녀에게 묻는다. Jane 이 승인하면 사용자 에이전트 요청에 미리 제공된 콜백 URI로 클라이언트를 리디렉션합니다.
http://printer.example.com/ready?oauth_token=hh5s93j4hdidpola&oauth_verifier=hfdp7dh39dks9884
콜백 요청, Jane 의 승인 과정 완료를 클라이언트에게 알립니다. 클라이언트는 다음 임시 보안 카드를 사용하여 (안전한 TLS 채널에서) 토큰 보안 카드를 요구한다.
POST /token HTTP/1.1 Host: photos.example.net Authorization: OAuth realm="Photos", oauth_consumer_key="dpf43f3p2l4k3l03", oauth_token="hh5s93j4hdidpola", oauth_signature_method="HMAC-SHA1", oauth_timestamp="137131201", oauth_nonce="walatlh", oauth_verifier="hfdp7dh39dks9884", oauth_signature="gKgrFCywp7rO0OXSjdot%2FIHF7IU%3D"
서버가 요청의 유효성을 검사하고 HTTP 응답 본문에 토큰 보안 카드를 갖게 한 응답이다.
HTTP/1.1 200 OK Content-Type: application/x-www-form-urlencoded oauth_token=nnch734d00sl2jdk&oauth_token_secret=pfkkdhi9sl3r4s00
토큰 보안 카드 설정으로 클라이언트는 개인 사진을 요구하기 위한 준비가 된다.
GET /photos?file=vacation.jpg&size=original HTTP/1.1<br> Host: photos.example.net<br> Authorization: OAuth realm="Photos",<br> oauth_consumer_key="dpf43f3p2l4k3l03",<br> oauth_token="nnch734d00sl2jdk",<br> oauth_signature_method="HMAC-SHA1",<br> oauth_timestamp="137131202",<br> oauth_nonce="chapoH",<br> oauth_signature="MdpQcU8iPSUjWoN%2FUDMsK2sui9I%3D" code>
'photos.example.net'서버가 요청의 유효성 확인하고 요청된 이미지를 반환한다. 'printer.example.com'는 Jane 의 승인 유효 기간이 종료되거나, Jane의 접근이 비활성화 될 때까지 동일한 토큰 보안 카드로 Jane 의 사진에 접근하는 것을 계속 유지 할 수 있다.
표기법 규칙
사용되는 각 키워드 "MUST (~해야한다)", "MUST NOT (가 안된다)", "REQUIRED (필수이다)", "SHALL (해야한다)", "SHALL NOT (수 없습니다) ","SHOULD (해야한다) ","SHOULD NOT (다 안된다) ", "RECOMMENDED (권장) ","MAY (수 있었다) ", "OPTIONAL (선택에 있다) "는 [RFC2119] 에 명시된 대로 해석 되어야 할 것이다.
리다이렉션 기반 인증
OAuth는 리소스 소유자가 클라이언트 인증을 부여하는 데 토큰을 사용한다. 일반적으로 토큰 보안 카드의 발행은 리소스 소유자의 요청을 받아 서버에서 발급한다. 이 때, 서버는 토큰 발행 전에 리소스 소유자의 신원을 (일반적으로 사용자 이름과 암호를 사용하여) 확인한다.
서버가 토큰 보안 카드를 제안하는 방법은 다양합니다. 이 섹션에서는 HTTP 리디렉션 및 리소스 소유자의 사용자 에이전트를 사용하는 하나의 방법을 정의하고 있다. 이 리디렉션 기반 인증 방법에는 3 가지 단계가 있다.
클라이언트는 서버에서 (식별자와 공유 키 형식) 임시 보안 카드를 가져 옵니다. 임시 보안 카드를 공인 과정을 통하여 액세스 요청을 식별하는 데 이용된다.
리소스 소유자는 클라이언트 (임시 보안 카드에 의해 확인된) 접근 요청을 서버가 허용하는 것에 대해 승인을 한다.
클라이언트 임시 보안 카드를 사용하여 서버에 토큰 보안 카드를 요청한다. 그러면 리소스 소유자는 보호된 리소스에 대한 접근이 가능하게 된다.
서버 토큰 보안 카드 발급 후 임시 보안 카드를 폐기해야 한다 (MUST). 임시 보안 카드는 유효 기간을 설정할 것을 권장한다 (RECOMMENDED). 서버는 클라이언트에 발급한 토큰 보안 카드를 리소스 소유자가 삭제하도록 해야한다 (SHOULD).
클라이언트가 이 단계를 수행할 수 있도록 서버는 다음과 같은 3 개의 엔드 포인트 URI를 알릴 필요가 있다.
임시 보안 카드 요청(Temporary Credential Request) 임시 보안 카드를 얻기 위해 클라이언트에서 사용되는 엔드 포인트. ( Section 2.1 참조)
리소스 소유자 인증(Resource Owner Authorization) 인증을 부여하고 리소스 소유자가 리디렉션되는 엔드 포인트. ( Section 2.2 참조)
토큰 요청(Token Request) 임시 보안 카드를 통해 토큰 보안 카드을 요청하기 위해 클라이언트에 사용되는 엔드 포인트. ( Section 2.3 참조)
서버에 의해 통보되는 3 개의 URI는 질의 요소를 포함할 수 있다 (MAY). ( [RFC3986] 3 절 참조) 단, 엔드 포인트 이용 시 URI에 추가되는 프로토콜 매개 변수와 충돌을 방지하기 위해 쿼리에 "oauth_"로 시작하는 매개 변수를 포함하면 안된다 (MUST NOT).
서버에서 3 개의 엔드 포인트를 알리고 문서화하는 방법은 이 사양의 범위 밖의 것이다. 클라이언트는 이 사양에 정의되지 않고 남아있거나 토큰의 크기와 기타 서버에서 생성된 값에 대해 추측을 피해야 한다. 프로토콜 매개 변수는 전송시 인코딩이 필요한 값을 포함할 수있다 (MAY). 클라이언와 서버는 값의 범위를 추정하지 않는다.
임시 보안 카드
클라이언트는 임시 보안 카드 요청 엔드 포인트에 인증된 ( Section 3 ) HTTP POST 요청을 사용하여 서버에서 임시 보안 카드를 얻는다. (다른 서버가 HTTP 요청 메소드를 권장하는 경우는 예외로 한다 ). 클라이언트는 다음의 필수 (REQUIRED) 매개 변수를 요청에 추가함으로써 (동일한 메서드를 사용하여 다른 매개 변수에 추가하여) 요청 URI를 구성한다.
oauth_callback: 리소스 소유자 인증 절차 ( Section 2.2 )가 완료되면 서버 리소스 소유자 리디렉션하는 절대 URI. 만약 클라이언트가 콜백을 받을 수 없거나 콜백 URI가 다른 수단을 통해 설치한 경우 이 매개 변수를 사용하지 않는 다는 것을 보여주기 위하여 oob(대소문자 구분)를 설정해야 한다 ( MUST).
서버에는 추가 매개변수를 지정할 수 있다. (MAY).
클라이언트는 클라이언트 보안 카드만을 사용하여 인증 요청합니다. 클라이언트는 빈 oauth_token 매개 변수를 요청에서 생략해도 좋다 (MAY). 또한 이 경우 토큰 보안 값으로 빈 문자열을 사용해야 한다 (MUST).
결과는 HTTP 응답 중에 텍스트 형식의 보안 카드로 반환되므로 서버가 TLS 또는 SSL 같은 전송 계층의 메커니즘 (혹은 그에 상응하는 안전한 채널)을 사용해야 한다 (MUST).
예를 들어 클라이언트는 다음과 같은 HTTPS 요청을 한다.
POST /request_temp_credentials HTTP/1.1<br> Host: server.example.com<br> Authorization: OAuth realm="Example",<br> oauth_consumer_key="jd83jd92dhsh93js",<br> oauth_signature_method="PLAINTEXT",<br> oauth_callback="http%3A%2F%2Fclient.example.net%2Fcb%3Fx%3D1",<br> oauth_signature="ja893SD9%26" code>
서버는 반드시 요청을 확인( Section 3.2 ) 해야 한다 (MUST). 요청을 사용하는 경우 서버는 클라이언트 (식별자와 공유 키 형식) 임시 보안 카드를 반환한다. 임시 보안 카드는 상태 코드 200 (OK)와 함께 응답 신체에 [W3C.REC-html40-19980424] 에서 정의된 "application / x-www-form-urlencoded" 형식에 포함된다 (OK).
응답에는 다음의 필수(REQUIRED) 매개 변수가 포함된다.
oauth_token 임시 보안 카드 식별자
oauth_token_secret 임시 보안 카드 공유 키
oauth_callback_confirmed 반드시 존재해야 (MUST)하고 true로 설정한다.
매개 변수는 이전 버전과 구별하기 위해 사용된다.
매개 변수 이름에 "token" 이 포함되어 있더라도 이 보안 카드는 토큰 보안 카드는 아니다. 하지만 비슷한 방식으로 다음 두 단계에서 토큰 자격을 증명하기 위해 사용된다.
예제
HTTP/1.1 200 OK<br> Content-Type: application/x-www-form-urlencoded<br> oauth_token=hdk48Djdsa&oauth_token_secret=xyz4992k83j47x0b&<br> oauth_callback_confirmed=true code>
리소스 소유자 인증
클라이언트는 서버에 토큰 보안 카드를 요구하기 전에 사용자를 서버로 이동시켜 요청에 대한 승인을 얻어야 한다 (MUST). 클라이언트는 리소스 소유자인가 엔드 포인트 URI에 다음과 같은 필수 (REQUIRED) 쿼리 파라미터를 추가하여 요청 URI를 구성한다.
oauth_token Section 2.1 에서 oauth_token 매개 변수로 주어진 임시 보안 카드의 식별자입니다. 서버는 이 매개 변수를 선택하는 것도 가능하지만 이 경우 리소스 소유자의 식별자를 나타내는 대체 수단을 제공해야 한다 (MUST).
서버 이외에도 매개 변수를 지정할 수도 있다 (MAY).
클라이언트는 HTTP 리다이렉트 응답 또는 리소스 소유자의 사용자 에이전트가 지원하는 다른 방법을 사용하여 구성된 URI로 이동한다. 이 요청은 HTTP GET 메소드를 사용해야 한다 (MUST).
예제 : 클라이언트는 리소스 소유자의 사용자 에이전트를 리디렉션하고 다음 HTTPS 요청을 수행한다.
GET /authorize_access?oauth_token=hdk48Djdsa HTTP/1.1<br> Host: server.example.com code>
서버의 인증 요청을 처리하는 방법에 대해 TLS 또는 SSL과 같은 안전한 채널의 이용 여부는 이 사양의 범위 밖이다. 서버는 먼저 리소스 소유자의 신원을 검증해야 한다 (MUST).
리소스 소유자가 요청한 접근 권한을 부여할 때 서버는 접근 요청하는 클라이언트의 정보를 리소스 소유자에게 제시해야 한다 (SHOULD). 이때 클라이언트 식별자와 관련된 임시 보안 카드를 이용한다. 이 같은 정보를 표시할 때 서버는 이 정보의 확인 여부를 명시해야 한다 (SHOULD).
리소스 소유자의 승인 여부를 받은 후, 콜백 URI에 oauth_callback 매개 변수 또는 기타 방법에 의하여 제공한 경우 서버는 리소스 소유자를 콜백 URI로 이동한다.
접근 권한을 허용한 것은 리소스 소유자가 클라이언트에 반환되는 리소스 소유자와 동일하다는 것을 확인하기 위해 서버는 인증 코드를 생성해야 한다 (MUST). 확인 코드는 추측 어려운 값으로, 리소스 소유자를 통해 클라이언트에 전달되고 리소스 소유자 승인 과정을 완료하기 위해 필요하다 (REQUIRED). 서버는 콜백 URI 쿼리 구성요소에 따라오는 필수 매개 변수를 추가하여 요쳥 URI를 구성한다.
oauth_token 클라이언트로부터 받은 임시 보안 카드의 식별자.
oauth_verifier 확인 코드.
콜백 URI에 이미 쿼리 요소가 포함된 경우 서버는 기존의 쿼리 뒤에 OAuth 파라미터를 추가해야 한다 (MUST).
예제 : 서버 리소스 소유자의 사용자 에이전트를 리디렉션하고, 다음 HTTP 요청을 수행한다.
GET /cb?x=1&oauth_token=hdk48Djdsa&oauth_verifier=473f82d3 HTTP/1.1<br> Host: client.example.net code>
클라이언트가 콜백 URI를 제공
하지 않은 경우, 서버는 인증 코드를 표시하고 리소스 소유자에게 수동으로 클라이언트 인증 프로세스 완료를 전달하도록 지시해야 한다 (SHOULD). 클라이언트가 임의의 제약이 있는 장치에서 동작하고 있는 것을 파악하고 있는 경우, 서버는 인증 코드를 수동으로 입력할 수 있는 형태로 제공해야 한다 (SHOULD).
토큰 보안 카드
클라이언트는 인증된 ( Section 3 ) HTTP "POST" 요청을 토큰 요청 엔드 포인트로 보내는 것으로 서버에서 토큰 보안 카드을 얻게 된다 (다른 서버가 HTTP 요청 메소드를 권장하는 경우는 예외로 한다). 클라이언트는 필수 (REQUIRED) 매개변수를 요청에 추가하여 요청 URI를 구성한다. (동일한 필드에 저장된 다른 프로토콜에 대한 매개 변수에 추가)
oauth_verifier 이전 단계에서 서버에서 받은 확인 코드이다.
요청할 때 클라이언트는 임시 보안 카드와 마찬가지로 클라이언트 보안 카드를 사용하여 인증한다. 임시 보안 카드는 인증된 요청에서 토큰 보안 카드 대신 사용되며 oauth_token 매개 변수로 전달된다.
요청 결과는 HTTP 응답하는 일반 텍스트로 반환되므로 서버가 TLS 또는 SSL 같은 전송 계층의 메커니즘 (혹은 그에 상응하는 안전한 채널)을 사용해야 한다 (MUST).
예를 들어 클라이언트는 다음 HTTPS 요청을 한다.
POST /request_token HTTP/1.1<br> Host: server.example.com<br> Authorization: OAuth realm="Example",<br> oauth_consumer_key="jd83jd92dhsh93js",<br> oauth_token="hdk48Djdsa",<br> oauth_signature_method="PLAINTEXT",<br> oauth_verifier="473f82d3",<br> oauth_signature="ja893SD9%26xyz4992k83j47x0b" code>
서버가 요청의 타당성을 검증 및 리소스 소유자가 클라이언트에 토큰 보안 카드를 제공하는 것을 허용하고 있다는 것을 확인하고 임시 보안 카드 만료 및 사용되지 않은 것을 확인( Section 3.2 ) 해야한다 (MUST). 서버는 또한 클라이언트에서 받은 확인 코드를 검사해야 한다 (MUST). 요청이 유효한 승인 경우 토큰 보안 카드는 상태 코드 200 (OK)과 함께 응답 본문에 [W3C.REC-html40-19980424] 으로 정의된 "application / x-www-form-urlencoded" 형식이 포함된다 (OK).
응답은 다음과 같은 필수 (REQUIRED) 매개 변수를 포함한다.
oauth_token 토큰 식별자
oauth_token_secret 토큰 공유 키
예제
HTTP/1.1 200 OK<br> Content-Type: application/x-www-form-urlencoded<br> oauth_token=j49ddk933skd9dks&oauth_token_secret=ll399dj47dskfjdk code>
서버는 범위, 유효 기간 및 리소스 소유자에 의해 입증된 다른 특성들을 보유하고 클라이언트가 발행한 토큰 보안 카드를 사용하여 요청을 수행할 때 이런 제약들을 필수로 지정해야 한다.
일단 토큰 보안 카드를 받으면 클라이언트는 리소스 소유자를 대신하여, 인증 요청 ( Section 3 )에 의해 보호되는 리소스에 접근하는 것을 계속할 유지 할 수 있다. 이때 얻은 토큰 보안 카드와 함께 클라이언트 보안 카드로 사용한다.
인증 요청
클라이언트가 [RFC2617] 정의하는 HTTP 인증 방법은 인증 HTTP 요청을 할 수 있다. 이 메서드를 사용하는 클라이언트는 자격 증명 (사용자 이름과 암호 등)을 사용하여 보호된 리소스에 대한 접근을 획득하며, 서버는 그 권한의 타당성을 검증할 수 있다. 대리 요청으로 이 메서드를 사용하는
경우 클라이언트는 리소스 소유자의 역할을 한다고 가정 할 필요가 있다.
OAuth는 클라이언트와 리소스 소유자를 식별하기 위한 것으로 각 요청에 2개의 보안 카드를 포함하도록 설계된 방법을 제공한다. 클라이언트는 리소스 소유자를 대신하여 인증된 요청을 하기전에 먼저 리소스 소유자가 인증된 토큰을 취득해야 한다. Section 2는 클라이언트가 리소스 소유자에 의해 승인된 토큰을 획득하는 방법으르 제공한다.
클라이언트 보안 카드는 고유 식별자 및 식별자 조합 공유 키 또는 RSA 키 쌍의 형식을 취한다. 인증된 요청을 하기전에 클라이언트는 서버와 보안 카드를 설정한다. 그러나 그 절차와 요구사항들은 이 사양의 범위를 벗어난 것들이다. 구현자는 클라이언트 인증서 기반의 보안에 영향을 잘 생각해야 한다. 일부 우려 사항은 Section 4.6 에서 설명하고 있다.
인증된 요청을 보내는 것은 서버 설정에 대한 사전 지식이 필요하다. OAuth 요청 시 프로토콜에 매개 변수를 전송하는 방법 ( Section 3.5 ) 클라이언트가 보안 카드의 소유권을 증명하기 위하여 이용하는 방법 ( Section 3.4 )이 각각 여러 존재한다. 클라이언트가 이러한 설정을 감지하는 방법은 이 사양의 범위를 벗어난다.
요청 실행
인증된 요청에는 몇개의 프로토콜 매개 변수가 포함된다. 매개 변수 이름 oauth_으로 시작하고 매개 변수 이름은 대소문자를 구별한다. 클라이언트는 일련의 프로토콜 매개 변수 값을 계산하여 아래와 같이 HTTP 요청에 추가하여 인증된 요청을 한다.
1. 클라이언트는 다음의 (별도로 명시하지 않는 한) 필수적인 (REQUIRED) 프로토콜 매개 변수에 해당 값을 지정한다.
oauth_consumer_key 클라이언트 보안 카드의 식별자 일부 (사용자 이름에 해당). 매개 변수 이름은 사양의 이전 버전에서 사용했던 용어 (Consumer Key)를 반영하고 있으며, 하위 호환성을 위해 그대로 사용한다.
oauth_token 리소스 소유자와 요청을 연결하기 위해 사용된다. 요청이 리소스 소유자와 연결되지 않는 경우(토큰이 없는 경우), 매개 변수를 생략 할 수 있다.
oauth_signature_method Section 3.4 에서 정의된 클라이언트 요청에 서명하기 위해 사용하는 서명 메서드의 이름입니다.
oauth_timestamp Section 3.3 에 정의되어 있는 타임 스탬프 값입니다. 서명 메서드로 "PLAINTEXT" 사용하는 경우 생략할 수 있다.
oauth_nonce Section 3.3 에서 정의되는 nonce 값. 서명 메서드로 "PLAINTEXT" 사용하는 경우 생략 할 수 있다.
oauth_version 옵션 (OPTIONAL). 추가하는 경우 1.0 이어야 한다. 이 사양에서 정의된 승인 단계의 버전을 보여준다.
2. 프로토콜 매개 변수는 Section 3.5 에 나와 있는 전송 방법 중 하나를 사용하여 요청에 추가됩니다. 매개 변수는 요청에 대하여 두 번 이상 포함해야 한다.
3. 클라이언트 Section 3.4 에 나와있는 대로 oauth_signature 매개 변수의 값을 계산하고 허용한다. 이 값은 이전 단계와 동일한 방법으로 요청에 추가합니다.
4. 클라이언트가 인증 요청을 서버로 전송한다.
예를 들어, 아래와 같은 HTTP 요청을 인증적으로 실행한다 ( c2 & a3 = 2 + q는 폼 인코드된 엔터티 본문을 강조하기 위해 사용)
GET /request?b5=%3D%253D&a3=a&c%40=&a2=r%20b HTTP/1.1<br> Host: example.com<br> Content-Type: application/x-www-form-urlencoded<br> c2&a3=2+q code>
클라이언트 클라이언트 보안 카드, 토큰 보안 카드 현재 타임 스탬프 독특한 nonce 서명 메서드로 HMAC-SHA1사용하는 것을 보여주고 프로토콜 매개 변수에 값을 할당한다.
oauth_consumer_key: 9djdj82h48djs9d2<br> code>
oauth_token: kkk9d7dh3k39sjv7<br>
oauth_signature_method: HMAC-SHA1<br>
oauth_timestamp: 137131201<br> code>
oauth_nonce: 7d8f3e4a code>
클라이언트가 OAuth HTTP 인증 헤더를 사용하여 요청 프로토콜 매개 변수를 추가한다.
Authorization: OAuth realm="Example",<br> oauth_consumer_key="9djdj82h48djs9d2",<br> oauth_token="kkk9d7dh3k39sjv7",<br> oauth_signature_method="HMAC-SHA1",<br> oauth_timestamp="137131201",<br> oauth_nonce="7d8f3e4a" code>
다음 oauth_signature 매개 변수의 값을 계산하고 요청에 추가합니다. 그리고 HTTP 요청을 서버에 전달한다.
GET /request?b5=%3D%253D&a3=a&c%40=&a2=r%20b HTTP/1.1<br> Host: example.com<br> Content-Type: application/x-www-form-urlencoded<br> Authorization: OAuth realm="Example",<br> oauth_consumer_key="9djdj82h48djs9d2",<br> oauth_token="kkk9d7dh3k39sjv7",<br> oauth_signature_method="HMAC-SHA1",<br> oauth_timestamp="137131201",<br> oauth_nonce="7d8f3e4a",<br> oauth_signature="djosJKDKJSD8743243%2Fjdk33klY%3D"<br> c2&a3=2+q code>
요청 유효성 검증
인증된 요청을 받은 서버는 다음과 같이 그 타당성을 검증해야 한다 (MUST).
요청 서명을 직접 재 계산 ( Section 3.4 )하고 "oauth_signature" 매개 변수로 클라이언트로부터 받은 값과 비교를 한다.
HMAC-SHA1 또는 RSA-SHA1 서명 방식을 사용하는 경우 클라이언트에서 받은 nonce 값, 타임 스탬프, 토큰 (있는 경우에만)의 조합이 이전 요청에 사용되지 않은 것인지를 확인해야 한다. (서버의 타임 스탬프가 이전과 동일한 요청을 거부 할 수 있다 (MAY) ( Section 3.3 ).)
토큰이 있으면 토큰으로 표시된 클라이언트 인증 정보의 범위와 상태를 확인한다. (서버는 토큰의 사용을 발급 대상이 된 클라이언트에만 제한을 선택할 수 있다 (MAY))
"oauth_version" 매개 변수가 있으면 해당 값이 1.0 인지 확인한다.
요청의 유효성 검증에 실패하면 서버가 해당 HTTP 상태 코드를 반환해야 한다 (SHOULD). 서버는 요청 본문에 거절 사유에 관한 자세한 내용을 포함 할 수 있다 (MAY).
서버가 지원하지 않는 매개 변수, 지원하지 않는 서명 방식, 잘못된 매개 변수, 중복된 프로토콜 매개 변수가 요청을 받을 경우 상태 코드 400 (Bad Request)을 반환해야 한다 (SHOULD). 서버는 잘못된 클라이언트 보안 카드와 잘못되거나 만료된 토큰, 잘못된 서명 또는 사용한 nonce 값을 포함하는 요청을 받을 경우 상태 코드 401 (Unauthorized) 을 반환해야 한다 (SHOULD).
Nonce 값 및 타임스탬프
타임 스탬프는 정수이어야 한다 (MUST). 서버 문서에서 규정되지 않는 한, 타임 스탬프 1970/01/01 00:00:00 GMT을 기점으로 경과 초(시간)로 표시된다.
nonce 값은 서버가 이미 요청을 실행하고 있는지 아닌지 확인하거나 안전하지 않은 통신 채널을 사용하여 요청한 경우 반복적인 공격을 막을 수 있도록 클라이언트에 의해 고유하게 생성되는 임의의 문자이다. nonce 값은 동일한 타임 스탬프, 클라이언트 보안 카드, 토큰 조합이 모든 요청에 대해 고유해야 한다 (MUST).
서버는 점검을 목적으로 nonce 값을 영구적으로 보유하고 하지 않도록 지난 타임 스탬프 요청을 거부하는 기간을 제한 할 수 있다 (MAY). 그러나 이 제한은 클라이언트와 서버의 시간이 일정 수준의 동기화가 되야한다는 것을 주의한다. 서버는 클라언트가 서버의 시간과 동기화하는 방법을 제공할 수 있다. 별도의 신뢰할 수 있는 시간 서비스를 이용하여 상호 시스템의 시간을 동기화 시킬 수 있다. 시간 동기화 방법에 대한 자세한 내용은 이 사양에서 다루지 않는다.
서명
OAuth 인증 요청은 "oauth_consumer_key"와 "oauth_token"라는 2 개의 보안 카드 정보를 가질 수 있다. 서버가 요청의 유효성을 검증하고 인증되지 않은 접근을 막기 위해 클라이언트는 보안 카드의 정당한 소유자임을 증명할 필요가 있다. 이것은 보안 카드의 공유 키 (또는 RSA 키) 부분을 사용하여 실현된다.
OAuth는 클라이언트가 보안 카드의 정당한 소유자임을 증명하는 방법으로 HMAC-SHA, RSA-SHA1, PLAINTEXT 3가지를 제공한다. PLAINTEXT 서명은 포함되지 않지만, 이들은 일반적으로 서명 방식으로 간주되고 있다. 이 외 RSA-SHA1에서는 클라이언트 보안 카드의 공유 키의 대신해 RSA 키가 이용된다.
각 구현은 각각의 요구 사항을 지킬 수 있도록 OAuth는 특정 서명 방식을 강요하지 않는다. 서버는 사용자 정의 방식으로 자유롭게 될 수 있다. 특정한 방법을 권장하는 것은 이 사양에서 다루지 않는다. 구현자는 지원하는 방식 을 결정하기 전에 보안 고려 사항( Section 4 )을 조사해야 한다.
클라이언트는 어떤 서명 방식을 사용하던 "oauth_signature_method" 파라미터를 사용하여 선언한다. 생성된 서명 (또는 이에 해당하는 것들)은 "oauth_signature" 변수에 포함한다. 서버는 각 시스템에 명시된 방법으로 서명을 확인한다.
문자열 기반 서명
문자열 기반 서명은 몇 가지의 HTTP 요청의 구성 요소를 반복 가능한 방식으로 연결하는 단일 문자열로 일관한다. 그 문자열은 HMAC-SHA1및 RSA-SHA1 서명 방식에 대한 입력 값이 된다.
문자열 기반 서명은 HTTP 요청의 다음의 구성 요소를 포함한다.
HTTP 요청 메소드 (예 : GET, POST etc.)
요청의 HTTP "Host" 헤더에 표시된 Authority.
리소스 요청 URI의 경로 및 쿼리 요소.
"oauth_signature" 제외한 프로토콜 매개 변수.
Section 3.4.1.3 에 정의된 엄격한 제약 조건을 만족는 요청 엔티티 본문에 포함된 매개 변수.
문자열 기반 서명은 HTTP 요청 전체를 커버하는 것은 아니다. 특히 주의해야 할 것은, 많은 요청에 엔티티 본문 또는 HTTP 엔티티 헤더가 포함되지 않는 것이다. 따라서 서버에서 SSL/TLS 또는 기타의 방법으로 추가적인 보호를 사용하지 않고는 요청 요소의 싱빙성 검증은 불가능하다는 것을 알아야 한다.
문자열 구축
문자열 기반 서명은 다음의 HTTP 요청 요소를 순차적으로 연결하여 구축된다.
HTTP 요청 메소드는 대문자로 (대). 예 HEAD: GET, POST등등. 고유한 HTTP 메소드를 이용하면 인코딩 하여야 한다 (MUST) ( Section 3.6 ).
문자 &(ASCII code 38)
Section 3.4.1.2 에 표시되는 문자열 기반 URI 인코딩 문자열 ( Section 3.6 ).
문자 &(ASCII code 38)
Section 3.4.1.3.2 에 일반화되어진 요청 파라미터를 인코딩된 문자열.
예를 들면, 다음과 같은 HTTP 요청이 있었다고 한다.
GET /request?b5=%3D%253D&a3=a&c%40=&a2=r%20b HTTP/1.1<br> Host: example.com<br> Content-Type: application/x-www-form-urlencoded<br> Authorization: OAuth realm="Example",<br> oauth_consumer_key="9djdj82h48djs9d2",<br> oauth_token="kkk9d7dh3k39sjv7",<br> oauth_signature_method="HMAC-SHA1",<br> oauth_timestamp="137131201",<br> oauth_nonce="7d8f3e4a",<br> oauth_signature="djosJKDKJSD8743243%2Fjdk33klY%3D"<br> c2&a3=2+q code>
이 때, 이 요청에 대한 문자열 기반 서명은 다음과 같다. (줄바꿈은 게재에 사정에 의한)
GET&http%3A%2F%2Fexample.com%2Frequest&a2%3Dr%2520b%26a3%3D2%2520q%<br> 26a3%3Da%26b5%3D%253D%25253D%26c%2540%3D%26c2%3D%26oauth_consumer_k<br> ey%3D9djdj82h48djs9d2%26oauth_nonce%3D7d8f3e4a%26oauth_signature_me<br> thod%3DHMAC-SHA1%26oauth_timestamp%3D137131201%26oauth_token%3Dkkk9<br> d7dh3k39sjv7 code>
문자열 기반 URI
문자열 기반 URI는 요청되는 리소스를 나타내는 "http" 이나 "https" URI를 구축하는 쪽으로 리소스 요청 URI의 스키마 Authority와 경로는 [RFC3986] 다음과 같이 포함된다.
스키마와 호스트는 소문자이어야 한다 (MUST).
호스트와 포트 번호는 HTTP 요청에서 "Host" 헤더의 값과 동일해야 한다 (MUST).
> 오 번호 스키마의 기본 포트인 포트 않으면 반드시 포트 번호를 포함해야 한다
> (MUST). 또한 기본의 포트 번호를 제외해야 한다 (MUST). 특히 HTTP 요청
> [RFC2616] 의 경우에는 포트 80, HTTPS 요청 [RFC2818] 의 경우에는 포트 443을
> 제외해야 한다 (MUST). 기타 기본 설정 이외의 포트 번호는 모두 포함해야한다
> (MUST).
예를 들면, 다음과 같은 HTTP 요청
GET /r%20v/X?id=123 HTTP/1.1<br> Host: EXAMPLE.COM:80 code>
은 문자열 기반 URI로 다음과 같다. "http://example.com/r%20v/X"
또한 다음과 같은 HTTPS 요청
GET /?q=1 HTTP/1.1<br> Host: www.example.net:8080 code>
은 문자열 기반 URI로 다음과 같다. "https://www.example.net:8080/".
요청 매개변수
요청 매개 변수의 일관성과 재현성을 확보하기 위하여 매개 변수를 모으고 원래 형태로 디코딩 된다. 그것들은 다음 정렬되고 자주 원래의 인코딩 스키마와 다른 특별한 방법으로 인코딩된 하나의 문자열에 연결된다.
매개변수 소스
아래에 포함된 매개 변수 군은 이름-값 쌍의 목록으로 정리한 것이다.
[RFC3986] 3.4 절에서 정의하는 HTTP 요청 URI의 쿼리 요소. 쿼리 요소는 "application / x-www-form-urlencoded" 문자열 이름과 값을 분할되어 [W3C.REC-html40-19980424] 17.13. 4 절에서 정의된 방식으로 디코딩한 이름 / 값 쌍의 목록으로 분리된다.
OAuth HTTP Authorization 헤더 필드 ( Section 3.5.1 )가 있으면 그 값을 반환 합니다. 헤더의 내용은 "realm" 매개 변수를 제외한 모든 이름 / 값 쌍을 구분된다. 매개 변수 값은 Section 3.5.1 에 정의된 방식으로 디코딩된다.
다음 조건을 충족하는 경우에만 HTTP 요청 엔티티 본문.
엔티티 본문이 단일 부분이다.
엔티티 본문이 [W3C.REC-html40-19980424] 으로 정의된 콘텐츠 형식 "application / x-www-form-urlencoded" 인코딩 요구 사항을 충족한다.
HTTP 요청 엔티티 헤더는 "application/x-www-form-urlencoded" 형식 Content-Type 헤드 필드 세트를 포함한다.
엔터티 본문은 [W3C.REC-html40-19980424] 17.13.4 절의 방법으로 디코딩 된 이름, 값 쌍의 목록으로 분해된다.
"oauth_signature" 매개 변수가 존재하면, 그것을 문자열 기반 서명에서 제외해야 한다. 명시적으로 요청에 포함된 매개 변수를 제외하고는 문자열 기반 서명에서 제외되어야 한다 ( "oauth_version" 변수가 지정되는 경우 등).
예를 들면 다음과 같은 HTTP 요청의 경우
GET /request?b5=%3D%253D&a3=a&c%40=&a2=r%20b HTTP/1.1<br> Host: example.com<br> Content-Type: application/x-www-form-urlencoded<br> Authorization: OAuth realm="Example",<br> oauth_consumer_key="9djdj82h48djs9d2",<br> oauth_token="kkk9d7dh3k39sjv7",<br> oauth_signature_method="HMAC-SHA1",<br> oauth_timestamp="137131201",<br> oauth_nonce="7d8f3e4a",<br> oauth_signature="djosJKDKJSD8743243%2Fjdk33klY%3D"<br> c2&a3=2+q code>
다음과 같은 (디코딩 된) 매개 변수가 문자열 기반 서명에 포함된다.
+------------------------+------------------+
| Name | Value |
+------------------------+------------------+
| b5 | =%3D |
| a3 | a |
| c@ | |
| a2 | r b |
| oauth_consumer_key | 9djdj82h48djs9d2 |
| oauth_token | kkk9d7dh3k39sjv7 |
| oauth_signature_method | HMAC-SHA1 |
| oauth_timestamp | 137131201 |
| oauth_nonce | 7d8f3e4a |
| c2 | |
| a3 | 2 q |
+------------------------+--------------------+
"b5"값은 "=%3D" 이고 "==" 아닌 것에 주의. "c@""와 "c2" 값이 비어있다. 이 사양에서 정의된 문자열 기반 서명 구축을 목적으로 한 인코딩 규칙은 인코딩된 공간 (ASCII 코드 32)을 나타내는 "+" 문자 (ASCII 코드 43)를 제외하고 있으나, 이것은 "application / x-www-form-urlencoded" 인코딩 된 값으로 널리 이용되고 있으며, "a3"변수 인스턴스의 하나로 나타나는 것과 같이 (이것은 "a32" 두번 등장한다), 제대로 디코딩 되어야 한다.
매개변수 표준화
Section 3.4.1.3 에 수집된 매개 변수는 다음과 같이 하나의 문자열로 표준화 된다.
먼저 각 매개 변수 이름과 값을 인코딩 한다. ( Section 3.6 )
매개 변수는 바이트 값을 오름차순를 사용하여 이름으로 분류된다. 2 개 이상의 매개 변수가 같은 이름을 가진 경우 값을 정렬한다.
매개 변수 이름은 "=" 문자 (ASCII 코드 61)를 구분자로 해당 값을 (값이 비어 있어도) 연결된다.
정렬 정의된 이름 / 값 쌍의 &문자 (ASCII 코드 38)를 구분자로 하나의 문자열로 연결된다.
예를 들어 이전 섹션에서 매개 변수의 목록은 다음과 같이 정규화된다.
인코딩된
+------------------------+------------------+
| Name | Value |
+------------------------+------------------+
| b5 | %3D%253D |
| a3 | a |
| c%40 | |
| a2 | r%20b |
| oauth_consumer_key | 9djdj82h48djs9d2 |
| oauth_token | kkk9d7dh3k39sjv7 |
| oauth_signature_method | HMAC-SHA1 |
| oauth_timestamp | 137131201 |
| oauth_nonce | 7d8f3e4a |
| c2 | |
| a3 | 2%20q |
+------------------------+------------------+
정렬된
+------------------------+------------------+
| Name | Value |
+------------------------+------------------+
| a2 | r%20b |
| a3 | 2%20q |
| a3 | a |
| b5 | %3D%253D |
| c%40 | |
| c2 | |
| oauth_consumer_key | 9djdj82h48djs9d2 |
| oauth_nonce | 7d8f3e4a |
| oauth_signature_method | HMAC-SHA1 |
| oauth_timestamp | 137131201 |
| oauth_token | kkk9d7dh3k39sjv7 |
+------------------------+------------------+
연결된 페어
+-------------------------------------+
| Name=Value |
+-------------------------------------+
| a2=r%20b |
| a3=2%20q |
| a3=a |
| b5=%3D%253D |
| c%40= |
| c2= |
| oauth_consumer_key=9djdj82h48djs9d2 |
| oauth_nonce=7d8f3e4a |
| oauth_signature_method=HMAC-SHA1 |
| oauth_timestamp=137131201 |
| oauth_token=kkk9d7dh3k39sjv7 |
+-------------------------------------+
그런 다음이 매개 변수를 연결하여 단일 문자열로 한다.
a2=r%20b&a3=2%20q&a3=a&b5=%3D%253D&c%40=&c2=&oauth_consumer_key=9dj<br> dj82h48djs9d2&oauth_nonce=7d8f3e4a&oauth_signature_method=HMAC-SHA1<br> &oauth_timestamp=137131201&oauth_token=kkk9d7dh3k39sjv7 code>
HMAC-SHA1
HMAC-SHA1 서명 방법은 [RFC2104] 에 규정된, HMAC-SHA1 서명 알고리즘을 사용 한다.
digest = HMAC-SHA1 (key, text)
HMAC-SHA1 함수의 변수는 다음과 같이 사용된다.
text
문자열 기반 서명 ( Section 3.4.1.1 참조)의 값을 설정한다.
key
아래 연결된 값을 설정한다. 1.인코딩 되고난 후에 클라이언트 공유 키. ( Section 3.6 ) 2."&" (ASCII 코드 38) (각각의 공유 키가 비어있는 경우도 포함해야 한다 (MUST)) 3. 인코딩 되고난 후에 토큰 공유 키. ( Section 3.6 )
digest
결과 바이트 문자열을 base64 인코딩 ( [RFC2045] 6.8 절 참조) 한 "oauth_signature" 프로토콜 매개 변수를 설정합니다.
RSA-SHA1
RSA-SHA1서명 방법은 [RFC3447] 8.2 절에 (일명 PKCS # 1) 규정되어 있다, RSASSA-PKCS1-v1_5 서명 알고리즘을 사용하고 있으며, SHA-1은 EMSA-PKCS1-v1_5의 해시 함수로 사용된다. 이 방법을 사용하기 위해 클라이언트는 서버에 RSA 공개 키 (이 사양은 범위)를 포함 클라이언트 보안 카드를 발급 받아야 한다 (MUST).
문자열 기반 서명은 [RFC3447] 8.2.1 항에 따라 RSA 비밀 키를 사용하여 서명된다.
S = RSASSA-PKCS1-V1_5-SIGN (K, M) code>
Where:
K
클라이언트의 RSA 개인 키를 설정합니다.
M
문자열 기반 서명 ( Section 3.4.1.1 참조)의 값을 설정합니다.
S
결과 바이트 문자열을 base64 인코딩 ( [RFC2045] 6.8 절 참조) 한 "oauth_signature" 프로토콜 매개 변수를 설정합니다.
서버는 [RFC3447] 8.2.2 항에 따라 서명의 유효성 확인한다.
RSASSA-PKCS1-V1_5-VERIFY ((n, e), M, S) code>
Where:
(n, e)
클라이언트의 RSA 공개 키를 설정합니다.
M
문자열 기반 서명 ( Section 3.4.1.1 참조)의 값을 설정합니다.
S
클라이언트로부터 받은 "oauth_signature" 프로토콜 매개 변수의 바이트 문자열을 설정합니다.
PLAINTEXT
PLAINTEXT 방식은 서명 알고리즘을 사용하지 않는다. 이 방식은 전송 계층의 메커니즘으로 TLS 또는 SSL (혹은 이에 상응하는 안전한 채널)을 사용해야 한다 (MUST). 이 방식은 문자열 기반 서명과 "oauth_timestamp", "oauth_nonce" 매개 변수를 사용하지 않는다.
"oauth_signature" 프로토콜 매개 변수는 다음과 같이 연결하여 값을 설정한다.
1. 인코딩 되고난 후에 클라이언트 공유 키 ( Section 3.6 ) 2.& (ASCII 코드 38) (각각의 공유 키가 비어있는 경우도 포함해야 한다 (MUST)) 3.인코딩 되고난 후에 토큰 공유 키 ( Section 3.6 )
매개변수 보내기
OAuth 인증 요청을 할 때, 프로토콜 매개 변수와 "oauth_" 접두사를 포함하여 요청하는 다른 모든 매개 변수가 다음과 같은 적절한 순서 중 한곳에 포함되어야 한다 (SHALL).
1. HTTP Authorization 헤더. ( Section 3.5.1 참조) 2. HTTP 요청 엔티티 본문. ( Section 3.5.2 참조) 3. HTTP 요청 URI 쿼리. ( Section 3.5.3 참조)
이 3 가지 방법 외에도 프로토콜 매개 변수를 요청에 포함하는 다른 방법이 향후의 확장 사양으로 정의될 수 있다 (MAY).
인증 헤더
프로토콜 매개 변수는 [RFC2617] 으로 정의되는 HTTP "Authorization" 헤더를 사용하여 전달된다. 이때 auth-scheme 이름 OAuth(대/소문자 구분)로 한다.
예제
Authorization: OAuth realm="Example",<br> oauth_consumer_key="0685bd9184jfhq22",<br> oauth_token="ad180jjd733klru7",<br> oauth_signature_method="HMAC-SHA1",<br> oauth_signature="wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D",<br> oauth_timestamp="137131200",<br> oauth_nonce="4572616e48616d6d65724c61686176",<br> oauth_version="1.0" code>
프로토콜 매개 변수는 다음과 같이 "Authorization" 헤더에 포함되 어야 한다 (SHALL).
매개 변수 이름과 값은 파라미터 인코딩에 따라 인코딩 된다. (Section 3.6)
매개 변수 이름 직후 =(ASCII code 61), "(ASCII code 34), 매개 변수 값 (공백도 허용 (MAY)), 그리고 "(ASCII code 34)가 따른다.
매개 변수는 ,(ASCII code 44)로 구분된다. 이 때 옵션으로 [RFC2617] 에 있는 "linear whitespace"를 가진 것도 있다 (OPTIONAL).
옵션 "realm" 파라미터를 추가할 수 있다 (OPTIONAL). ( [RFC2617 ' 섹션 1.2 참조)
서버는 클라이언트에서 보호되는 리소스에 대한 요청에 대한 HTTP "WWW-Authenticate" 응답 헤더 필드를 반환하면 OAuth auth-scheme을 지원하는 것을 보여줄 수 있다 (MAY). [RFC2617] ' 과 같이, 그러한 응답은 HTTP "WWW-Authenticate" 헤더 필드를 포함할 수있다 (MAY).
예제
WWW-Authenticate: OAuth realm="http://server.example.com/" code>
이 realm 매개 변수는 보호 영역을 보여준다. ( [RFC2617 ' 섹션 1.2 참조)
Form-Encoded 본문
프로토콜 파라미터는 HTTP 요청 엔티티 본문을 사용하여 보낼 수 있다. 하지만 이 경우는 아래의 조건을 충족해야 한다 (REQUIRED).
엔터티 본문은 단일 부분이다.
엔터티 본문은 [W3C.REC-html40-19980424] 에서 정의된 것과 같이 "application / x-www-form-urlencodedcontent" 인코딩 요구에 응한다.
HTTP 요청 엔티티 헤더는 "Content-Type" 헤더를 포함하고, 그 값이 "application / x-www-form-urlencoded" 이다.
예제 (줄바꿈 게재에 사정에 의한)
oauth_consumer_key=0685bd9184jfhq22&oauth_token=ad180jjd733klr<br> u7&oauth_signature_method=HMAC-SHA1&oauth_signature=wOJIO9A2W5<br> mFwDgiDvZbTSMK%2FPY%3D&oauth_timestamp=137131200&oauth_nonce=4<br> 572616e48616d6d65724c61686176&oauth_version=1.0 code>
엔터티 본문은 다른 요청 특정 매개 변수를 포함할 수 있다 (MAY). 만일 그렇다면, 프로토콜 매개 변수를 적절하게 "&"(ASCII code 38)로 연속되는 요청 특정 매개 변수 다음에 추가되어야 한다 (SHOULD).
요청 URI 쿼리
프로토콜 매개 변수는 HTTP 요청 URI에 [RFC3986] 섹션 3에 정의된 것과 같이 쿼리 매개 변수로 부여하고 보낼 수있다.
예제
GET /example/path?oauth_consumer_key=0685bd9184jfhq22&<br> oauth_token=ad180jjd733klru7&oauth_signature_method=HM<br> AC-SHA1&oauth_signature=wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%<br> 3D&oauth_timestamp=137131200&oauth_nonce=4572616e48616<br> d6d65724c61686176&oauth_version=1.0 HTTP/1.1 code>
요청 URI는 다른 요청 특정 쿼리 매개를 포함할 수 있다 (MAY). 만일 그렇다면, 프로토콜 매개 변수를 적절하게 "&"(ASCII code 38)가 연속되는 요청 특정 매개 변수 다음에 추가되어야 한다 (SHOULD).
퍼센트(%) 인코딩
기존 퍼센트 인코딩 기술은 일관된 문자열 기반 서명 구성은 보장하지 않는다. 다음의 퍼센트 인코딩 방법은 [RFC3986] 및 [W3C.REC-html40-19980424] 에 이미 정의된 퍼센트 인코딩 기술을 대체하기 위해 정의되는 것은 아니다. 이 방법은 문자열 기반 서명 및 authorization 헤더 필드의 인코딩에만 사용되는 것이다. ( Section 3.5.1 )
이 사양은 다음과 같이 퍼센트 인코딩 방법을 정의한다.
텍스트 값이 [RFC3629]으로 정의된 UTF-8 바이트로 인코딩되어 있지 않으면 그렇게 인코딩 된다. 인간이 이용하지 않는 이진 값들은 생략한다.
값은 다음 [RFC3986] 으로 정의된 퍼센트 인코딩 방법 따라 이스케이프 한다.
다른 문자는 모두 인코딩 해야한다 (MUST).
인코딩된 문자를 나타내는 2자리의 16진수 문자는 대문자여야만 한다.
[RFC3986] 섹션 2.3에서 정의된 예약되지 않은 문자 (알파벳 숫자, "-", "", "_", "~")는 인코딩하면 안된다 (MUST NOT).
이 기법 "application/x-www-form-urlencoded" 에서 사용하는 인코딩 방식과는 다르다. (예를 들어 이 기술은 공백 문자로 "+"가 사용되는 것이 아니라 "%20" 으로 인코딩 되는)이 방법은 Web 개발 프레임워크가 제공하는 퍼센트 인코딩에서는 다를 수 있다 (MAY). (다른 문자를 인코딩하고, 소문자 16 진수 문자를 사용하는 등)
보안 고려사항
[RFC2617] 에 명시된 바와 같이 일반적으로 최대의 위험 요인은 프로토콜의 본질이 아니라 그 프로토콜을 사용하기 위한 정책 및 절차에 있는 경우가 많다. 구현자는, 이 프로토콜이 어느 정도의 보안 요건을 충족하는지 여부를 스스로 평가하기를 권장한다.
RSA-SHA1 서명방식
RSA-SHA1 서명을 이용한 공인 요청은 토큰 공유 키 및 클라이언트 공유 키는 사용되지 않는다. 따라서 이것은 전적으로 클라이언트가 서명 생성에 사용되는 비밀 키 기밀성에 의존한다.
요청 기밀성
이 프로토콜은 요청의 유효성 검증 메커니즘을 제공하지만, 요청의 기밀성은 보장되지 않는다. 기타 예방 조치가 되어 있지 않으면, 도청으로 요청 전체 내용을 가로챌 수있다. 서버는 요청에서 전송되어진 데이터의 종류를 고려하고, 기밀 정보가 포함된 리소스를 보호하기 위해 TLS 메커니즘을 사용해야 한다.
서버의 스푸핑
이 프로토콜은 서버의 신뢰성을 검증하는 것이 아니다. 적의를 가진 제 삼자가 이 점을 악용하여 클라이언트의 요청을 가로 채고 조작 또는 잘못된 응답을 반환할 수 있다. 제공자는 서비스 구축 시 이러한 공격을 고려하여 서버 및 요청 응답의 신뢰성이 요구되는 요청은 TLS를 사용해야 한다.
필수 인증 내용의 프록시와 캐시
HTTP Authorization 체계는( Section 3.5.1 ) 옵션이다, [RFC2616] 은 "Authorization" 및 "WWW-Authenticate" 헤더를 바탕으로 필수 인증 내용 확인을 실시한다. 특히 프록시와 캐시 헤더 필드를 사용하지 않는 경우 요청을 적절하게 보호하는 것은 실패할 수 있습니다.
예를 들면, 개인의 인증된 내용은 공개적으로 접근 가능한 형식으로 저장될 수 있다. HTTP Authorization 헤더 필드를( Section 3.5.1 ) 사용하지 않는 서버가 Cache-Control 헤더와 같은 다른 수단을 사용하여 필수 인증 콘텐츠 보호를 보장해야 한다.
보안 카드 Plaintext 저장소
클라이언트 공유 키와 토큰 공유 키는 기존의 인증 시스템의 암호와 같은 기능을 가진다. RSA-SHA1 이외의 방법으로 사용하는 서명을 계산하려면 서버가 그 키를 일반 텍스트 형식으로 접근할 수 있어야 한다. 최근 운영체제가 사용자 인증 정보를 돌이킬 수 없는 해시로 저장하는 것을 볼때 이것은 대조적이다.
만약 공격자가 이 키에 접근 또는 서버 가진 모든 키 데이터베이스에 대한 접근 권한을 박탈하면 공격자는 리소스 소유자를 대신해 모든 작업을 수행 할 수 있게 된다. 따라서 서버는 권한이 없는 사람에게서 이 키를 엄격하게 보호해야 한다.
클라이언트 보안 카드 기밀성
대부분의 경우, 클라이언트 응용 프로그램은 잠재적으로 실뢰할 수 없는 영역의 관리하에 있다. 예를 들면 클라이언트가 데스크톱 응용 프로그램 소스코드 및 실행 파일의 바이너리가 공개되는 경우 공격자가 분석을 위해 사본을 다운로드하고 클라이언트 보안 카드을 찾아 사용할 수 있다.
이 경우, 서버가 클라이언트의 신원을 확인할 때 클라이언트 보안 카드만 사용하면 안된다. 가능하면 IP 주소와 같은 다른 요소들도 채택해야 한다.
피싱공격
이 사양과 유사한 프로토콜이 널리 실용화되면 리소스 소유자가 암호를 입력하기 위해 웹 사이트로 리다이렉션되는 것에 익숙해질 수 있다. 이런 웹 사이트들의 신뢰성을 주의 깊게 확인하지않고 리소스 소유자가 인증 정보를 입력해 버리면 리소스 소유자의 암호는 공격자에 의해서 도난당할 가
능성이 있다.
서버는 리소스 소유자에게 피싱 공격의 위험에 대한 정보를 제공하며 손 쉽게 웹 사이트의 신뢰성을 검증할 수 있는 수단을 제공해야 한다. 클라이언트 개발자는 사용자 에이전트와 상호 작용 (다른 윈도우나 소스 등)의 보안 문제와 최종 사용자가 서버 웹사이트의 신뢰성을 검증하는 기능을 고려해야 한다.
접근 요청 범위
이 프로토콜은 자체가 클라이언트에 부여할 권한의 범위를 결정하는 방법을 제공한다. 그러나 대부분의 응용 프로그램은 사용 권한 분할을 필요로 하고있다. 예를 들어, 서버가 특정 보호되는 리소스에 대한 접근를 허용하면, 다른 사람은 허용하지 않으며, 제한된 접근 (읽기 전용 등) 만 허용하는 경우가 있다.
이프로토콜을 구현할 때 서버는 리소스 소유자가 클라이언트에 부여하고자 하는 접근 형식을 고려하고 그것을 실현하는 매커니즘을 제공해야 한다. 서버는 리소스 소유자가 접근하려는 자신의 권한 뿐만 아니라 어떤 위험을 가지고 있는지에 대한 이해하고 있다는 것을 신중하게 검토하여야 한다.
인증서의 엔트로피
전송계층 보안 프로토콜을 사용하지 않는 경우, 도청에 의해 인증된 요청 및 서명에 완전히 접근할 수 있게 되고 따라서 보안 카드 사용을 복구하는 오프라인 무차별 대입 공격을 탑재할 수 있게 된다. 서버는 이러한 공격에 대비해 최소한의 유효기간을 정해 공유 키가 정체되지 않도록 충분한 길이로 임의의 공유키를 할당해야 한다..
예를 들면, 2주간 공유 키를 사용하면 서버는 2 주 내에 무차별 대입 공격을 통해 공유 키를 획득하는 것이 불가능함을 보장해야 한다. 물론 서버는 충분한 길이의 키를 사용하여 해결하여야 한다.
Pseudo-Random Number Generator(의사 난수 생성기)를 사용하는 것은 충분히 높은 품질의 키를 생성하기 위해 중요합니다. 많은 PRNG 구현은 임의의 수열을 생성하는 경우에도 암호 해독과 무차별 입력을 쉽게 할 수 있는 패턴 및 취약점을 가졌다. 구현자는 이러한 문제가 없는 안전한 PRNG를 사용하여야 한다.
DoS 공격 / 자원 고갈 공격
이 사양에는 서버 리소스를 소모시키는 공격을 가능하게 하는 부분이 많다. 예를 들면, 이 프로토콜은 서버에서 nonce 값이 사용되었는지 검사하도록 요구하고 있다. 공격자가 순식간에 수 많은 nonce 값을 사용할 수 있으면, 그들을 시험하기 위해 서버 리소스를 고갈시켜 버릴 것이다. 또는 서명을 확인하기 위해 서버에 높은 계산 능력을 요구할 수 있다. 공격자는 유효하지 않는 요청을 대량으로 보내는 DoS 공격으로 악용할 수 있다.
자원 고갈 공격은 결코 이 사양만의 특유한 것은 아니지만, 구현자는 이 사양이 고갈 공격 방법에 대해 표면화 하고 있는 것을 고려하여 충분한 설계를 해야한다. 예를 들어 엔트로피의 부족은 새로운 엔트로피를 기다리는 동안 DoS나 약한 (추측하기 쉬운) 키를 초래하게 된다. 구현에 있어서 서버는 이러한 응용 프로그램에서 심각한 위험을 초래할 수 있다는 것을 고려하여 충분한 설계를 해야 한다.
SHA - 1 공격
HMAC-SHA1 서명 방식, RSA-SHA1 서명 방식으로 사용되는 SHA-1은 충돌 공격에 많은 취약점이 있는 것으로 알려져 있다. 이 취약점은 HMAC-SHA1 서명 방식의 이용에는 영향 없어 보인다, RSA-SHA1 서명 방식에는 영향이 있다. NIST는 디지털 서명으로 SHA-1의 사용을 2010년까지 단계적으로 폐지할 예정이라고 발표했었다.
사실, 이 취약점을 이용하는 것은 어렵고 이용자에게 심각한 위험을 초래하는 것은 아니다. 그러나 이것들은 보다 효율적인 공격이 가능하게 될지도 모르며 서버에서는 SHA-1이 응용 프로그램을 위해 충분한 보안 수준을 제공할 것인가를 생각할 때 이 점을 염두해 두어야 한다.
문자열 기반 서명 제약
문자열 기반 서명은 이 사양에 정의된 서명 방식을 지원하기 위해 설계되었다. 앞으로 서명 방식을 추가하는 설계자는 문자열 기반 서명의 호환성 및 보안 요구 사항을 평가해야 한다. 많은 요청 엔티티 본문 및 엔티티 헤더, 매개 변수의 표시 순서 등의 정보는 문자열 기반 서명에 포함되지 않는다. 이 처럼 문자열 기반 서명은 HTTP 요청 전체를 커버하는 것이 없기 때문에 서버는 문자열 기반 서명에 포함되지 않는 요소를 보호하는 메커니즘을 추가 도입해야 한다.
크로스사이트 요청 위조 (CSRF)
Cross-Site Request Forgery(CSRF)는 HTTP 요청이 믿을 수 있는 웹 사이트 또는 인증된 사용자가 전송하는 Web 기반 공격이다. CSRF 공격은 인증 승인에서 공격자가 보호된 리소스에 대한 승인을 사용자 동의 없이 얻기 위해 허용 할 수 있다. 서버는 모든 프로토콜 인증 엔드 포인트에서 CSRF 대책 사례를 고려해야 한다.(SHOULD).
CSRF 공격은 클라이언트의 OAuth 콜백 URI에서도 가능하다. 클라이언트는 클라이언트 사이트의 리소스 소유자가 서버와 OAuth 통신을 완료하는 의도가 있는 것을 확인하여 OAuth 콜백 URI로 CSRF 공격을 예방해야 한다. 이러한 CSRF 공격 방어 수단은 이 사양 밖의 범위이다.
유저 인터페이스 Redress
서버는 인증 과정에서 UR Redress 공격 ( "클랙재킹"으로 잘 알려진 )을 방지한다. 이 사양이 작성될 당시 완벽한 UI redress를 막을 방법은 존재하지 않았다. 서버는 다음과 같은 기술을 통해 UI redress 위험을 줄일 수 있다.
Javascript로 프레임 해제.
Javascript로 프레임 해제 및 승인 페이지에서 브라우저의 Javascript를 활성화하는 것을 요구.
브라우저별 프레임 방지 기술.
OAuth token 발급 전에 비밀번호 입력 요구.
반복적 인증의 자동처리
서버가 이미 리소스 소유자의 승인을 얻은 클라이언트 인증 요청( Section 2.2 )을 자동으로 처리하는 것을 원할지도 모른다. 리소스 소유자가 접근 권한 부여를 위해 서버로 리다이렉션 되는 경우 서버는 리소스 소유자가 이미 클라이언트에서 접근 권한을 부여받고 있다는 것을 감지했다. 이 경우 서버는 리소스 소유자에게 승인을 요구하는 대신 리소스 소유자를 자동으로 클라이언트에게 리다이렉션 한다.
클라이언트 보안 카드가 노출되는 경우 자동 처리는 추가적인 보안위험을 만들어 낸다. 공격자는 훔친 클라이언트 보안 카드를 사용하여 리소스 소유자 서버에 리다이렉션하고 인증 요청을 할 수 있다. 그러면 서버는 리소스 소유자의 승인 절차없이 리소스 소유자에게 접근 권한을 부여하게 된다. 물론 공격에 대한 주의를 요구한다. 자동 승인이 구현되지 않으면 공격자가 리소스 소유자에게 접근 권한을 부여하기 위해서 사회 공학을 사용해야 한다.
서버는 자동 처리에 연관되어진 위험을 줄이기 위해 자동 승인 프로세스를 통해 실행되는 토큰 보안 카드 범위를 제한할 수 있다. 리소스 소유자의 동의를 얻어 발행된 토큰 보안 카드에 영향을 줄 필요는 없다. 클라이언트는 클라이언트 보안 카드를 보호하기 위한 자동화된 프로세스에 연관되는 위험을 줄일 수 있다.
IANA 고찰
이 메모는 IANA에 대한 요청을 포함하지 않는다.
Acknowledgments
이 사양은 여러 기업에 의해 개별적으로 구현된 기존의 고유 프로토콜 및 우수 사례를 바탕으로 만들어진 커뮤니티 사양 OAuth Core 1.0 Revision A 이 직접적인 기반이 되었다.
커뮤니티 사양은 Eran Hammer 에 의해 편집되고 Lahav, Mark Atwood, Dirk Balfanz, Darren Bounds, Richard M. Conlan, Blaine Cook, Leah Culver, Breno de Medeiros, Brian Eaton, Kellan Elliott - McCrea, Larry Halff, Eran Hammer - Lahav, Ben Laurie, Chris Messina, John Panzer, Sam Quigley, David Recordon, Eran Sandler, Jonathan Sergent, Todd Sieling, Brian Slesinsky, Andy Smith 에 의해 쓰여졌다.
편집자는 이 에디션을 공개하기 위해 많은 도움을 준 분들에게 감사함을 전한다.
Lisa Dusseault, Justin Hart, Avshalom Houri, Chris Messina, Mark Nottingham, Tim Polk, Peter Saint - Andre, Joseph Smarr, Paul Walker.
Appendix A. 커뮤니티 버전의 차이
본 사양은 원래 커뮤니티 사양 [OAuth Core 1.0 Revision A] 이 공개되고 나서 발견된 다음과 같은 실수나 누락 부분을 해결하기 위해 변경 사항을 포함한다.
plain text를 보낼 때 TLS / SSL 사용을 SHOULD 에서 MUST 로 변경. 이렇게 하면 임시 보안 카드( Section 2.1 ) 요청 및 토큰 보안 카드( Section 2.3 ) 검색 뿐만 아니라, "PLAINTEXT" 서명 방식의 이용에 영향을 미친다.
토큰 / 타임 스탬프 / 클라이언트 조합이 유일하게 되도록 nonce의 표시를 통제.
타임 스탬프가 이전의 요청에 이용되는 것보다 크거나 같을 필요가 있다는 사실을 삭제.
"PLAINTEXT" 서명 방식을 사용할 때 nonce 및 타임 스탬프 파마리터를 옵션으로 변경.
문자열 기반 서명의 범위는 사용되는 HTTP 메소드가 POST 이 외의 경우 "application / x-www-form-urlencode" 엔티티 본문 파라미터를 HTTP 메소드가 GET 이 아닌 경우는 URI 쿼리 파라미터 확장.
이중 인코딩의 오류를 방지하기 위해 각 서명 방식에 대한 해설은 "oauth_signature" 파라미터에 서명 값을 삽입하기 전 인코딩한 것을 덧붙임.
"oauth_token" 매개 변수가 비어있는 경우 생략을 허용.
빈 "oauth_token" 매개 변수를 임시 보안 카드 요청에 전송하는 것을 허용.
"oauth_" 매개 변수 추가 정의를 제한하는 항목은 삭제.
Appendix B. Document History
To be removed by the RFC editor before publication as an RFC.
-10
o Added missing 'oauth_token' in exmaple.
o Changed realm values from URI to string to make them more generic (since the protocol does not define any internal structure for them).
-09
o Added 'with a 200 status code (OK)' in two places.
o Missing comma in example.
o Corrected typos.
o Changed the use of TLS/SSL when sending or receiving plain text credentials to a MUST.
o Clarified text about change control moving from the community to the IETF.
-08
o Adjusted timestamp language to allow use of time servers for clock sync.
o Revised security language for SHA-1 weakness and applicability.
o Added link to the community specification.
o Minor editorial changes.
-07
o Corrected typos.
o Changed examples to use HTTPS in authorization step.
o Clarified the use of 'oauth_' tokens in the three static endpoint URIs.
o Edited abstract and introduction.
-06
o Moved parameter section into client instructions.
o Added more examples in the delegation section, including more complete HTTP responses.
o Removed language about restricting the use of the 'oauth_' prefix.
o Changed the nonce and timestamp parameters to optional when using PLAINTEXT.
o Allowed empty token in temporary credentials requests.
-05
o Replaced the word 'lexicographical' with 'ascending' in sorting instructions.
o Added note that the 'a3' parameter appears twice in the example.
o Made the note about the encoding scheme being different from most common implementations more explicit.
o Moved and cleaned up the example from appendix to introduction.
Removed crypto details from the example.
-04
o Corrected typo and other minor editorial changes.
o Added warning about token sizes.
o Clarified that all 'oauth_' parameters must be transmitted using the same method.
o Added explicit requirement to exclude parameters not transmitted in a request in the signature base string (for example oauth_version when omitted).
o Explicitly set OAuth to use HTTP 1.1.
o Rearranged the signature base string section to provide a better narrative of how the HTTP request is normalized. Added the protocol parameters to the examples to better demonstrate how they are incorporated in practice.
o Flipped the document order between authentication and authorization.
o Removed the requirement for timestamps to be equal or greater than previous timestamps.
-03
o Updated draft with changes from OAuth Core 1.0 Revision A to fix a session fixation exploit.
o Small editorial corrections.
o Removed confusing language from 'Denial of Service / Resource Exhaustion Attacks'.
o Added new 'Differences from the Community Edition' appendix.
o Updated acknowledgements section.
-02
o Corrected mistake in parameter sorting order (c%40 comes before c2).
o Added requirement to normalize empty paths as '/'.
-01
o Complete rewrite of the entire specification from scratch. Separated the spec structure into two parts and flipped their order.
o Corrected errors in instructions to encode the signature base string by some methods. The signature value is encoded using the transport rules, not the spec method for encoding.
o Replaced the entire terminology.
-00
o Initial draft based on the OAuth Core 1.0 community specification with the following changes.
o Various changes required to accommodate the strict format requirements of the IETF, such as moving sections around (Security, Contributors, Introduction, etc.), cleaning references, adding IETF specific text, etc.
o Moved the Parameter Encoding sub-section from section 5 (Parameters) to section 9.1 (Signature Base String) to make it clear it only applies to the signature base string.
o Nonce language adjusted to indicate it is unique per token/timestamp/consumer combination.
o Added security language regarding lack of token secrets in RSA-SHA1.
o Fixed the bug in the Normalize Request Parameters section. Removed the "GET" limitation from the third bullet (query parameters).
o Removed restriction of only signing application/x-www-form-urlencoded in "POST" requests, allowing the entity-body to be used with all HTTP request methods.
References
Normative References
[RFC2045] Freed, N. and N. Borenstein, "Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies", RFC 2045, November 1996.
[RFC2104] Krawczyk, H., Bellare, M., and R. Canetti, "HMAC: Keyed-Hashing for Message Authentication", RFC 2104, February 1997.
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, March 1997.
[RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H., Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext Transfer Protocol -- HTTP/1.1", RFC 2616, June 1999.
[RFC2617] Franks, J., Hallam-Baker, P., Hostetler, J., Lawrence, S., Leach, P., Luotonen, A., and L. Stewart, "HTTP Authentication: Basic and Digest Access Authentication", RFC 2617, June 1999.
[RFC2818] Rescorla, E., "HTTP Over TLS", RFC 2818, May 2000.
[RFC3447] Jonsson, J. and B. Kaliski, "Public-Key Cryptography Standards (PKCS) #1: RSA Cryptography Specifications Version 2.1", RFC 3447, February 2003.
[RFC3629] Yergeau, F., "UTF-8, a transformation format of ISO 10646", STD 63, RFC 3629, November 2003. [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform Resource Identifier (URI): Generic Syntax", STD 66, RFC 3986, January 2005.
[W3C.REC-html40-19980424] Hors, A., Raggett, D., and I. Jacobs, "HTML 4.0 Specification", World Wide Web Consortium Recommendation REC-html40-19980424, April 1998, <http://www.w3.org/TR/1998/REC-html40-19980424>.
Informative References
[NIST SHA-1 Comments]
Burr, W., "NIST Comments on Cryptanalytic Attacks on SHA-1".
[OAuth Core 1.0 Revision A]
OAuth, OAuth Community., "OAuth Core 1.0 Revision A".
Author's Address#
Eran Hammer-Lahav (editor)
Email: eran@hueniverse.com
URI: http://hueniverse.com
Html markup produced by rfcmarkup 1.86, available from http://tools.ietf.org/tools/rfcmarkup/
일본 번역 자료를 토대로 한글화 작업이 되었습니다. 경우에 따라 매끄럽지 않거나 잘못된 번역이 있을 수 있습니다.
