블로그 이미지
핑크대지

태그목록

공지사항

최근에 올라온 글

최근에 달린 댓글

글 보관함

calendar

1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

OAuth 프로토콜 관점에서 본 OAuth 인증과정

2008. 8. 28. 14:24 | Posted by 핑크대지

 

OAuth프로토콜 관점에서 본 OAuth 인증과정

본 문서는 OAuth프로토콜 관점에서 본 OAuth 인증과정을 설명하며, OAuth 스팩의 Appendix A - Protocol Example의 내용을 기반으로 작성되었습니다.

각 과정은 아래에 나온 순서도에 기반하여 이루어지기 때문에 그림과 함께 보면 이해하는데 도움이 될 것입니다.

* 이 사진에 나오는 A,B,C.. 단계는 아래의 단계와 관련이 없습니다.

A. 프로토콜 예제

본 예제에서는 서비스 프로바이더인 photos.example.net 는 사진 공유 사이트이며, 컨수머인 printer.example.com은 사진 출력 사이트입니다. Jane은 사용자이며 photos.example.com에 저장되어 있는 비공개 사진인 vacation.jpg를 출력하기 위하여 printer.example.com 서비스를 사용할 것입니다.

Jane이 그녀의 아이디와 비밀번호를 입력하여 photos.example.net 에 로그인하면, 그녀는 http://photos.example.net/photo?file=vacation.jpg URL을 통해 그녀의 사진에 접근할 것입니다. 다른 사용자들은 그 사진에 접근할 수 없으며, Jane은 그녀의 아이디와 비밀번호를 printer.example.com에 공유하고싶지 않습니다.

이 예제에서 파라미터를 전송할때 사용되는 요청은 URL 쿼리 메소드를 사용합니다. 이는 단순한 예제를 위해 사용되며 한개의 메소드가 다른 용도로 사용되어서는 안됩니다.

A.1. 문서화와 등록

서비스 프로바이더의 문서에서는 컨수머 키컨수머 시크릿을 등록하는 방법을 설명하며, 다음과 같은 URL들을 선언해 주어야 합니다.

Request Token URL:
https://photos.example.net/request_token, HTTP POST 사용
User Authorization URL:
http://photos.example.net/authorize,  HTTP GET 사용
Access Token URL:
https://photos.example.net/access_token, HTTP POST 사용
Photo (Protected Resource) URL:
http://photos.example.net/photo , file파라미터와 size파라미터(선택적)와 함께 전송

서비스 프로바이더는 모든 요청에 대하여 HMAC-SHA1 시그네쳐를 지원하며, 보안(HTTPS)요청일 경우에만 PLAINTEXT을 사용할 수 있음을 말해줍니다.

컨수머인 printer.example.com은 이미 컨수머 키컨수머 시크릿을 photos.example.net으로 부터 부여 받았으며, 출력할 사진은 photos.example.net에 저장되어 있음을 명시합니다. 컨수머 등록을 하면 다음과 같은 값들을 부여받습니다:

Consumer Key:
dpf43f3p2l4k3l03
Consumer Secret:
kd94hf93k423kf44
A.2. 리퀘스트 토큰 얻기

Jane이 printer.example.com에게 photos.example.net에  저장되어 있는 그녀의 휴가사진을 출력할 것임을 알려주면, 출력 웹사이트는 사진에 접근을 시도할 것이며, 그 사진은 비공개이기 때문에 HTTP 401 Unauthorized 메시지를 받습니다. 서비스 프로바이더는 응답과 함께 다음과 같은 헤더를 포함합니다:

WWW-Authenticate: OAuth realm="http://photos.example.net/"

컨수머서비스 프로바이더에게 다음과 같은 HTTP POST를 보내야 합니다.

https://photos.example.net/request_token?oauth_consumer_key=dpf43f3p2l4k3l03&oauth_signature_method=PLAINTEXT&oauth_signature=kd94hf93k423kf44%26&oauth_timestamp=1191242090&oauth_nonce=hsu94j3884jdopsl&oauth_version=1.0

서비스 프로바이더는 signature를 검사하고, HTTP 응답의 바디에 인증되지 않은 리퀘스트 토큰과 함께 응답합니다.

oauth_token=hh5s93j4hdidpola&oauth_token_secret=hdhd0244k9j7ao03
A.3. 사용자 인증 요청하기

컨수머는 Jane의 비공개 사진으로 접근을 승인을 얻기 위하여 브라우저를 서비스 프로바이더의 Authoirization URL로 리다이렉트 시킵니다.

http://photos.example.net/authorize?oauth_token=hh5s93j4hdidpola&oauth_callback=http%3A%2F%2Fprinter.example.com%2Frequest_token_ready

서비스 프로바이더는 Jane이 그녀의 아이디와 비밀번호를 사용해 로그인 할 것을 요청하고, 성공적으로 로그인을 했으면, printer.example.com이 그녀의 비공개 사진에 접근할 권한을 줄 것인지 묻습니다. Jane이 요청을 승인하면, 서비스 프로바이더컨수머의 callback URL로 리다이렉트 시킵니다:

http://printer.example.com/request_token_ready?oauth_token=hh5s93j4hdidpola
A.4. 액세스 토큰 얻기

이제 컨수머는 Jane이 승인한 리퀘스트 토큰을 알고 있으며, 서비스 프로바이더에게 그것을 액세스 토큰으로 교환해 줄 것을 요청합니다:

https://photos.example.net/access_token?oauth_consumer_key=dpf43f3p2l4k3l03&oauth_token=hh5s93j4hdidpola&oauth_signature_method=PLAINTEXT&oauth_signature=kd94hf93k423kf44%26hdhd0244k9j7ao03&oauth_timestamp=1191242092&oauth_nonce=dji430splmx33448&oauth_version=1.0

서비스 프로바이더는 signature를 검사하고 HTTP 응답의 바디에 액세스 토큰을 넘겨줍니다:

oauth_token=nnch734d00sl2jdk&oauth_token_secret=pfkkdhi9sl3r4s00
A.5. 보호된 자원에 접근하기

컨수머는 이제 비공개 사진을 요청할 준비가 되었습니다. 사진 URL이 HTTPS가 아니라면, 반드시 HMAC-SHA1을 사용해야 합니다.

A.5.1. Signature Base String 생성하기

signature를 생성하기 위해, Signature Base String을 생성해야 합니다. 요청은 다음과 같은 파라미터들(oauth_signature를 제외한)을 순서대로 노멀라이즈된 문자열로 연결한 것을 포함해야 합니다.

oauth_consumer_key:
dpf43f3p2l4k3l03
oauth_token:
nnch734d00sl2jdk
oauth_signature_method:
HMAC-SHA1
oauth_timestamp:
1191242096
oauth_nonce:
kllo9940pd9333jh
oauth_version:
1.0
file:
vacation.jpg
size:
original

다음과 같은 것들이 Signatrue Base String을 생성하기 위해 사용됩니다.

  1. GET
  2. http://photos.example.net/photos
  3. file=vacation.jpg&oauth_consumer_key=dpf43f3p2l4k3l03&oauth_nonce=kllo9940pd9333jh&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1191242096&oauth_token=nnch734d00sl2jdk&oauth_version=1.0&size=original

Signature Base String 은 다음과 같습니다:

GET&http%3A%2F%2Fphotos.example.net%2Fphotos&file%3Dvacation.jpg%26oauth_consumer_key%3Ddpf43f3p2l4k3l03%26oauth_nonce%3Dkllo9940pd9333jh%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1191242096%26oauth_token%3Dnnch734d00sl2jdk%26oauth_version%3D1.0%26size%3Doriginal
A.5.2. Signature 값 암호화 하기

HMAC-SHA1은 Signature Base String을 text로, kd94hf93k423kf44&pfkkdhi9sl3r4s00(컨수머 키&액세스토큰시크릿)를 key로 사용하여 base64-encoding된 문자열로 변환된 값을 만들어 냅니다:

tR3+Ty81lMeYAr/Fid0kMTYa/WM=
A.5.3. 보호된 자원 요청하기

사진을 요청하기 위한 컨수머의 요청내용을 정리해 보면 :

http://photos.example.net/photos?file=vacation.jpg&size=original
                Authorization: OAuth realm="http://photos.example.net/",
                oauth_consumer_key="dpf43f3p2l4k3l03",
                oauth_token="nnch734d00sl2jdk",
                oauth_signature_method="HMAC-SHA1",
                oauth_signature="tR3%2BTy81lMeYAr%2FFid0kMTYa%2FWM%3D",
                oauth_timestamp="1191242096",
                oauth_nonce="kllo9940pd9333jh",
                oauth_version="1.0"

쿼리 파라미터를 사용한다면:

http://photos.example.net/photos?file=vacation.jpg&size=original&oauth_consumer_key=dpf43f3p2l4k3l03&oauth_token=nnch734d00sl2jdk&oauth_signature_method=HMAC-SHA1&oauth_signature=tR3%2BTy81lMeYAr%2FFid0kMTYa%2FWM%3D&oauth_timestamp=1191242096&oauth_nonce=kllo9940pd9333jh&oauth_version=1.0

photos.example.net은 signature를 검사하고 나서 요청한 사진을 응답으로 돌려줄 것입니다.




여기까지 OAuth프로토콜 관점에서 본 OAuth인증 과정을 살펴보았습니다. 이제 OAuth의 이해를 바탕으로 실제 컨수머 개발을 위해 튜토리얼을 참고하시기 바랍니다.