본 문서는 OAuth프로토콜 관점에서 본 OAuth인증과정을 설명하며, OAuth 스팩의 Appendix A-Protocol Example의 내용을 기반으로 작성되었다. 각 과정은 아래에 나온 순서도에 기반하여 이루어지기 때문에 그림과 함께 보면 이해하는데 도움이 될 것이다.
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들을 선언해 주어야 한다.
서비스 프로바이더는 모든 요청에 대하여 HMAC-SHA1 시그네쳐를 지원하며, 보안(HTTPS)요청일 경우에만 PLANTEXT을 사용할 수 있음을 말해준다. 컨수머인 printer.example.com은 이미 컨수머 키와 컨수머 시크릿을 photos.example.net으로 부터 부여 받았으며 출력할 사진은 photos.example.net에 저장되어 있음을 명시한다. 컨수머 등록을 하면 다음과 같은 값들을 부여받는다.
A.2. 리퀘스트 토큰 얻기
Jane이 printer.example.com에게 photos.example.net에 저장되어 있는 그녀의 휴가사진을 출력할 것임을 알려주면 출력 웹사이트는 사진에 접근을 시도할 것이며, 그 사진은 비공개이기 때문에 HTTP 401 Unauthorized 메시지를 받는다. 서비스 프로바이더는 응답과 함께 다음과 같은 헤더를 포함한다.
컨수머는 서비스 프로바이더에게 다음과 같은 HTTP POST를 보내야 한다.
?oauth_consumer_key=dpf43f3p2l4k3l03&oauth_signature_method=PLAINTEXT
&oauth_signature=kd94hf93k423kf44%26&oauth_timestamp=1191242090
&oauth_nonce=hsu94j3884jdopsl&oauth_version=1.0
서비스 프로바이더는 signature를 검사하고, HTTP 응답은 body에 인증되지 않은 리퀘스트 토큰과 함께 응답한다.
oauth_token=hh5s93j4hdidpola&oauth_token_secret=hdhd0244k9j7ao03
A.3. 사용자 인증 요청하기
컨수머는 Jane의 비공개 사진으로 접근 승인을 얻기 위하여 브라우저를 서비스 프로바이더의 Authorization 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이 요청을 승인하면 서비스 프로바이더는 컨수머의 callbackURL로 리다이렉트 시킨다.
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
서비스 프로바이더는 시그네쳐를 검사하고 HTTP응답의 body에 엑세스 토큰을 넘겨준다.
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
다음과 같은 것들이 Signature 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은 signautre를 검사하고 나서 요청한 사진을 응답으로 돌려줄 것이다.
출처 : http://overfloweb.com/zbxe/795
'Web Programing' 카테고리의 다른 글
html 코딩하는데 간격이 뒤죽박죽 일때!! (0) | 2012.12.21 |
---|---|
OAuth 인증방식의 이해 Ⅰ : 용어 정리 및 사용자 관점에서의 OAuth (0) | 2011.10.27 |
HTML 폰트 종류 (0) | 2011.09.02 |
현재 페이지 주소 출력하기 (0) | 2011.09.02 |
트위터, 페이스북에 링크 공유하기 (0) | 2011.09.02 |