(스펙 원본: http://openid.net/specs/openid-authentication-1_1.html)
|
D. Recordon |
|
|
B. Fitzpatrick |
|
|
May 2006 |
OpenID 인증은 사용자가 제시한 URL이 본인의 소유임을 증명함으로써 인증을 수행한다. 비밀번호나 전자우편주소와 같이, 어떤 다른 것도 전달하지 않고도 인증 절차를 진행할 수 있다.
OpenID는 완전히 분산되어 있다. 이는 누구나 Consumer 또는 Identity 제공자가 될 수 있으며, 이를 위해 중앙의 권위주체로부터 허가나 등록 또한 받을 필요가 없다는 것을 의미한다. 사용자는 자신이 사용하고 싶은 Identity 제공자를 선택할 수 있고, Identity 제공자를 변경할 경우에도 Identity를 유지할 수 있다.
OpenID 의 프로토콜은 JavaScript 나 최신브라우저를 요구하지는 않지만, 인증방식상 소위 "AJAX"-스타일 셋업을 깔끔하기 적용할 수 있으며, 최종사용자가 현재 페이지를 떠나지 않고도 인증을 수행할 수도 있다.(물론 보안 이슈는 있다-역자).
본 OpenID 인증 스펙상에는 사용자 프로파일 정보를 교환하기 위한 어떤 방법도 제공하지 않지만, Consumer 는 해당 OpenID 페이지에 연결된 세만틱한 형식의 문서들 (FOAF, RSS, Atom, vCARD, 등)을 통해서 사용자에 대한 정보를 얻을 수 있다. 또한 프로파일 정보 교환 수단을 제공하기 위해, 현재 OpenID 인증 기반 위에서 확장 스펙들이 작성 중이다.
1. 요구 사항 표시법
2. 용어
3. 개관
3.1. HTML 문서를 Identifier 로 바꾸기
3.1.1. 인증 위임하기
3.2. 제시된 Identifier 제출하기
3.3. Consumer 사이트는 Identifier URL 내용을 구한다
3.4. Smart 대 Dumb 모드
3.5. Consumer 는 Identifier 를 검증한다
4. Modes
4.1. associate
4.1.1. 요청 인자들
4.1.2. 응답 인자들
4.1.3. 추가 사항
4.2. checkid_immediate
4.2.1. 요청 인자들
4.2.2. 응답 인자들
4.2.3. 추가 사항
4.3. checkid_setup
4.3.1. 요청 인자들
4.3.2. 응답 인자들
4.3.3. 추가 사항
4.4. check_authentication
4.4.1. 요청 인자들
4.4.2. 응답 인자들
4.4.3. 추가 사항
5. 보안 고려 사항
Appendix A. Default Values
Appendix A.1. Diffie-Hellman P Value
Appendix B. Error Responses
Appendix C. Key-Value Format
Appendix D. Limits
Appendix E. Misc
6. Normative References
§ Authors' Addresses
이 문서의 요구 사항 수준을 정확히 표현하기 위해 한글 표현 이외에도, 영문 키워드들 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", "OPTIONAL" 을 [RFC2119] (Bradner, B., “Key words for use in RFCs to Indicate Requirement Levels,” .) 에 정의된 의미로 괄호안에 추가 표시 한다.
| TOC |
- 최종 사용자 (End User):
- Consumer 에게 자신의 아이덴티티를 증명하고자 하는 실제 사람.
- Identifier:
- Identifier 는 단지 하나의 URL 이다. 전체 OpenID 인증 프로토콜의 흐름은 최종 사용자가 하나의 URL 을 소유했음을 증명하는 것에 관한 것이다.
- 제시된 Identifier (Claimed Identifier):
- Consumer 에 의해 아직 검증되지 않았지만, 최종 사용자가 자신의 것이라고 말하는 Identifier.
- 검증된 Identifier (Verified Identifier):
- 최종 사용자가 Consumer 에게 자신의 것임을 증명한 Identifier.
- Consumer:
- 제시한 Identifier가 최종 사용자의 소유인지 검증하고 싶은 웹 서비스.
- Identity 제공자 (Identity Provider):
또는 "IdP" 나 "서버" 로도 불린다. 제시한 Identifier가 최종 사용자의 소유임을 암호학적으로 증명받기 위해 Consumer 가 접속하는 OpenID 인증 서버이다. 최종 사용자가 어떻게 IdP에서 인증받는지에 대한 내용은 OpenID 인증 스펙의 범위를 벗어난다 (역주: 따라서 IdP 에 따라서 다르다).
- User-Agent:
- 최종 사용자의 웹브라우저. 특별한 플러그인이나 자바스크립트는 필요없다.
| TOC |
| TOC |
Identifier를 처리하는 Identity 제공자를 Consumer에게 알리기 위해, 최종 사용자는 반드시 자신의 URL(역주: 최종 사용자의 Identifier URL) 에 위치한 HTML 문서의 HEAD 섹션에 markup 을 추가해야 한다. 이 HTML 문서의 호스트가 최종 사용자의 Identity 제공자가 되어야 할 필요는 없다(NOT REQUIRED); 그 Identifier URL 과 Identity 제공자는 완전히 분리된 서비스일 수 있다.
최종 사용자의 Identiifer 로 http://example.com/ 을 사용하고 Identity 제공자로 http://openid.example.com 을 사용하려면, Identifier URL 을 가져올때 전송되는 HTML 문서의 HEAD 섹션에 다음 태그가 추가 될 것이다.
<link rel="openid.server" href="http://openid.example.com/">
| TOC |
만일 최종 사용자의 호스트가 Identity 제공자를 구동할 수 없거나, 최종 사용자가 다른 호스트에서 운영되는 Identity 제공자를 사용하고자 한다면, 그들의 인증을 위임할 필요가 있다. 예를 들어, 최종 사용자는 자신의 웹사이트, http://www.example.com/, 를 자신의 Identifier로 사용하기를 원하지만 Identity 제공자를 운영할 수단이 없거나 운영하고 싶지 않을 수 있다.
만일 최종 사용자가 LiveJournal 계정을 하나 가지고 있고(사용자 "exampleuser" 이라 하자), LiveJournal 이 OpenID Identity 제공자를 보유하여 최종 사용자가 http://exampleuser.livejournal.com/ 이라는 Identifier를 제어함을 보증한다면, 최종 사용자들은 자신들의 인증을 LiveJournal 의 Identity 제공자에게 위임할 수 있을 것이다.
즉, 최종사용자는 그들의 Identifier 로 www.example.com 을 사용하지만 Consumer 들이 실제로는 http://www.livejournal.com/openid/server.bml 에 위치한 Identity 제공자를 통해 http://exampleuser.livejournal.com/ 라는 Identifier를 검증토록 하기 위해, 최종사용자의 Identifier URL (www.example.com)을 가져올 때 전송될 HTML 문서의 HEAD 섹션에 다음 태그들을 추가해야 한다.
<link rel="openid.server" href="http://www.livejournal.com/openid/server.bml">
<link rel="openid.delegate" href="http://exampleuser.livejournal.com/">
이제, Consumer 가 해당 태그를 인식하면, http://www.livejournal.com/openid/server.bml 에게 그 최종 사용자가 exampleuser.livejournal.com 인지 여부를 질의한다. 이 과정에서 www.example.com 는 전혀 언급하지 않는다.
이 방식의 주요 장점은 최종 사용자가 자신 Identifier 를 여러 해 동안 유지할 수 있다는 것이다; 심지어 서비스들이 새로 나오고 또 사라지더라도 위임하는 Identity 제공자를 바꾸면서 같은 Identifier 를 계속 유지할 수 있다.
| TOC |
| TOC |
위 예제에서, 최종 사용자는 OpenID 인증을 지원하는 Consumer 사이트를 방문한다. Consumer 는 최종 사용자에게 Identifier URL 입력을 위한 폼입력란을 제시한다.
예를 들면:
----------------------------------
|[logo]example.com | [Login Button]
----------------------------------
| TOC |
| TOC |
이제 Consumer 사이트는 최종 사용자가 제시한 Identifier 에 있는 문서를 읽어들인다. Consumer 는 HEAD 섹션을 파싱해서 "openid.server" 선언과 선택적으로 "openid.delegate" 선언을 가져온다.
| TOC |
| TOC |
OpenID 인증은 다른 성능의 Consumer 들을 수용하기 위해서 "smart mode" 와 "dumb mode" 를 지원한다. Smart Consumer 는 시작할 때 좀 더 많은 작업을 수행함으로서 나중에 적은 동작을 하지만, 상태 정보를 로컬 캐시로 유지할 필요가 있다. Dumb Consumer 는 상태를 전혀 유지하지 않지만, 한번의 HTTP 요청을 별도로 요구한다.
| TOC |
이 Consumer 는 이제 Identity 제공자의 checkid_immediate (또는 checkid_setup) URL 에 대한 URL 을 하나 구성하여 User-Agent 를 그곳으로 보낸다.
User-Agent 를 해당 URL로 보냄으로써, 최종 사용자의 쿠키를 비롯한 모든 로그인 증명들이 그들의 신뢰하는 Identity 제공자에게 전송된다. 이 Identity 제공자는 자신의 작업을 수행하고, 전달된 openid.return_to URL 에 자신의 응답을 추가하여 User-Agent 를 원래의 Consumer 에게 돌려 보낸다.
| TOC |
| TOC |
| TOC |
값: "associate"
값: 선호되는 association type
기본값: "HMAC-SHA1"
Note: 현재는 기본 값 하나만 지원
값: 공백 또는 "DH-SHA1"
기본값: 공백. (평문)
Note: 이 공유 보안 값을 암호화 하려면 DH-SHA1 모드를 사용할 것을 권장한다
값: base64(btwoc(p))
Note: 기본 p 값은 Appendix A.1 (Diffie-Hellman P Value) 을 참조하라.
값: base64(btwoc(g))
기본값: g = 2
Note: DH-SHA1 session_type 을 사용할 때만 이용한다. openid.dh_modulus 값이 지정되면 이 값은 반드시 지정되어야 한다.
값: base64(btwoc(g ^ x mod p))
Note: DH-SHA1 session_type 을 사용할 때는 반드시 필요하다.(REQUIRED)
| TOC |
Response format: Key-Value Pairs
값: 결과 핸들의 association type.
Note: 현재 유일한 모드는 HMAC-SHA1 이며, 모든 Consumer 들은 반드시 지원해야 한다(MUST). 캐싱할때 Consumer 는 반드시 하나의 assoc_handle 에 그 보안값과 assoc_type 를 모두 매핑해야 한다(MUST).
값: 이후 처리(transaction) 에 제공될 association 핸들.
Note: Consumer 는 해당 expires_in 값 이후에는 이 핸들을 사용하면 안된다 (MUST NOT).
값: 이 association 핸들이 유효한 시간(초), 10진수로 표시.
값: 이 Provider 가 선택한 암호화 모드. 공백, 생략, 또는 ""DH-SHA1" 일 수 있다(MAY).
값: base64(btwoc(g ^ y mod p))
Description: DH-SHA1 사용시, Provider 의 Diffie-Hellman public key (Rescorla, E., “Diffie-Hellman Key Agreement Method,” .) [RFC2631].
값: base64(SHA1(btwoc(g ^ (xy) mod p)) XOR secret(assoc_handle))
Description: DH-SHA1 사용시, 암호화된 공유 보안값.
값: base64(secret(assoc_handle))
Description: DH-SHA1 미사용시, 평문으로된(plaintext) 공유 보안값.
| TOC |
| TOC |
| TOC |
값: "checkid_immediate"
값: 제시된(Claimed) Identifier
값: 앞의 associate 요청에서 받은 assoc_handle 값.
Note: 선택적임; association 핸들이 제공되지 않거나 IdP가 유효하지 않다고 느낄 경우, consumer는 반드시 check_authentication을 사용해야 한다(MUST).
값: Provider 가 User-Agent 를 가급적(SHOULD) 되돌려 보내야 하는 URL.
값: Provider 가 최종 사용자에게 신뢰여부를 확인해야(SHALL) 할 URL.
기본: return_to URL
선택: 최종 사용자가 승인하기 위해 실제로(SHALL) 보게 되는 URL 이어야 한다.
| TOC |
Response format: query string arguments
| TOC |
값: "id_res"
| TOC |
값: 입증(asssertion)을 위해 필요한 일들을 사용자가 할 수 있도록 User-Agent 를 보내는 URL.
| TOC |
값: 검증된(Verified ) Identifier
값: 불투명한(Opaque) association 핸들로 서명을 위한 HMAC 키를 찾기 위해 사용된다.
값: 요청 메시지에서 보낸 return_to URL 파라미터로 Provider가 수정하기 전에 복사한 것.
값: 콤마로 분리된, 서명된 필드들 목록.
Note: 서명된 필드명들의 "openid." 은 생략한다. 예를 들면, "mode,identity,return_to".
값: base64(HMAC(secret(assoc_handle), token_contents)
Note: token_contents는 키-값 형식의 문자열로, 응답 메시지에 포함된 모든 서명된 키와 값을 가리킨다. 이 값은 openid.signed 필드에 있는 순서와 반드시 동일하게 위치되어야 한다(MUST). consumer는 서명을 체크하기 전에 token_contents를 재생성 해야한다(SHALL). Appendix D (Limits)을 참조.
값: 선택적임; 요청 메시지에서 보내진 association 핸들로서, provider가 받아들이지 않거나 인식하지 못할 경우에 보낸다.
| TOC |
| TOC |
| TOC |
값: "checkid_setup"
값: 제시된(Claimed) Identifier
값: 앞의 associate 요청에서 받은 assoc_handle 값.
Note: 선택적임; association 핸들이 제공되지 않거나 IdP가 유효하지 않다고 느낄 경우, consumer는 반드시 check_authentication을 사용해야 한다(MUST).
값: Provider 가 User-Agent 를 되돌려 보내야 하는(SHOULD) URL.
값: Provider 가 최종 사용자에게 신뢰 여부를 확인해야(SHALL) 할 URL.
기본: return_to URL
선택: 최종 사용자가 승인하기 위해 실제로(SHALL) 보게 되는 URL 이어야 한다.
| TOC |
Response format: query string arguments
| TOC |
값: "id_res" 또는 "cancel"
| TOC |
값: 검증된(Verified ) Identifier
값: 불투명한(Opaque) association 핸들로 서명을 위한 HMAC 키를 찾기 위해 사용된다.
값: 요청 메시지에서 보낸 return_to URL 파라미터로 Provider가 수정하기 전에 복사한 것.
값: 콤마로 분리된, 서명된 필드들 목록.
Note: 서명된 필드명들의 "openid." 은 생략한다. 예를 들면, "mode, identity, return_to".
값: base64(HMAC(secret(assoc_handle), token_contents)
Note: token_contents는 키-값 형식의 문자열로, 응답 메시지에 포함된 모든 서명된 키와 값을 가리킨다. 이 값은 openid.signed 필드에 있는 순서와 반드시 동일하게 위치되어야 한다(MUST). consumer는 서명을 체크하기 전에 token_contents를 재생성 해야한다(SHALL). Appendix D (Limits)을 참조.
값: 선택적임; 요청 메시지에서 보내진 association 핸들로서, provider가 받아들이지 않거나 인식하지 못할 경우에 보낸다.
| TOC |
| TOC |
| TOC |
값: "check_authentication"
값: checkid_setup 이나 checkid_immediate 응답의 association 핸들.
값: consumer 가 검증하길 원하는 checkid_setup이나 checkid_immediate 요청의 서명.
값: consumer 가 서명을 검증 하려는 checkid_setup이나 checkid_immediate 요청에 있는 서명된 필드들 목록.
값: consumer는 반드시 openid.signed 목록에 있는 모든 openid.* 응답 파라미터를 전송해야 하며(MUST), 이 목록은 checkid_setup이나 checkid_immediate 요청에서 얻은 것으로, provider로부터 받은 값을 그대로 사용해야 한다.
값: 선택적임: invalidate_handle로 반환된 association 핸들.
| TOC |
Response format: Key-Value Pairs
값: "id_res"
값: "true" 또는 "false"
설명: Boolean; 서명이 유효한지 여부.
값: 불투명한(opaque) association 핸들
설명: 존재한다면, consumer는 반환된 association 핸들을 캐시에서 지워야(uncache) 한다(SHOULD).
| TOC |
| TOC |
| TOC |
| TOC |
1551728981814736974712322577637155\ 3991572480196691540447970779531405\ 7629378541917580651227423698188993\ 7278161526466314385615958256881888\ 8995127215884267541995034125870655\ 6549803580104870537681476726513255\ 7470407658574792912915723345106432\ 4509471500722962109419434978392598\ 4760375594985848253359305585439638443
| TOC |
이 섹션은 프로토콜/런타임 오류에 속하는 것으로, 인증 오류는 아니다. 인증 오류들은 프로토콜에 명시된다.
| TOC |
Lines of:
| TOC |
| TOC |
| TOC |
| [RFC2119] | Bradner, B., “Key words for use in RFCs to Indicate Requirement Levels.” |
| [RFC2396] | Berners-Lee, T., “Uniform Resource Identifiers (URI): Generic Syntax.” |
| [RFC2631] | Rescorla, E., “Diffie-Hellman Key Agreement Method.” |
| TOC |
| David Recordon | |
| Email: | drecordon@verisign.com |
| Brad Fitzpatrick | |
| Email: | brad@danga.com |