검색결과 리스트
인증에 해당되는 글 1건
- 2011.01.01 OAuth의 세부사항
글
OAuth의 세부사항
네트워크로그
2011. 1. 1. 03:05
① Request Token 요청 / ③ Access Token 요청 / ④ Protected Resources 요청 단계에서 적절한 oauth 파라미터를 함께 전달해주어야
하는데 이 파라미터들에 대해서 알아보자. Consumer는 ServiceProvider 에게 3가지 방법 중 하나를 통해 파라미터를 전달할 수 있다.
1) HTTP 헤더에 Authorization 헤더를 통해 전달한다.
2) HTTP 헤더의 POST request body를 통해 전달한다. (이때 Content-Type 헤더는 application/x-www-form-urlencoded로 설정함)
3) URL의 쿼리 파트를 통해 전달한다.
어느 방법을 선택해도 되지만, 이 포스팅에서는 첫번째 방법을 설명하겠다. 전체적인 흐름을 나타낸 그림은 다음과 같다.
oauth 파라미터
oauth 파라미터는 OAuth 스펙에서 요구하는 "oauth_ " 접두어를 갖는 파라미터를 의미한다. oauth 파라미터의 종류와 그 의미는
다음과 같다.
| oauth_version | OAuth 프로토콜의 버전으로 1.0으로 설정하며, 선택적인 파라미터 값이다 |
| oauth_consumer_key | ServiceProvider 에서 제공하는 Consumer 를 고유하게 식별하기 위한 값 |
| oauth_token | request token 값으로 Request token 요청시에는 사용되지 않으며, Access token 요청과 자원조회시에는 사용된다. |
| oauth_timestamp | GMT 1970년 1월 1일 00:00:00 이후 현재까지의 흐른 초로, 밀리초가 아닌 초 단위 임에 주의하자 |
| oauth_nonce | reply attack 을 예방하기 위해, 동일한 timestamp 를 갖는 요청마다 유일한 랜덤값이다. |
| oauth_signature_method | oauth 파라미터 값들이 도중에 변경되지 않았음을 보장하기 위해 사용하는 해시 알고리즘의 종류로, HAC-SHA1, RSA-SHA1 등이 있다. 이 포스팅에서는 HAC-SHA1 를 사용한다. |
| oauth_signature | HMAC-SHA1 를 사용하여 생성한 알고리즘의 결과값이다. 이 알고리즘 적용에 필요한 키와 데이터에 대해서는 아래에서 자세히 다루겠다. |
| oauth_callback | Authorize URL 에 접속하여 사용자의 허용을 받고 리다이렉트 시킬 URL 이다. Consumer가 웹서비스가 아닌 애플리케이션이면 "oob" 로 설정해야 한다. (oob는 out of band의 약자이다.) |
| oauth_verifier | 사용자 허용을 통해 응답받은 값으로, Access token 요청시에만 설정한다. |
Request token URL 요청: oauth_consumer_key, oauth_callback, oauth_timestamp, oauth_nonce, oauth_signature_method, oauth_signature
oauth_version
Access token URL 요청: oauth_consumer_key, oauth_callback, oauth_timestamp, oauth_nonce, oauth_signature_method, oauth_signature, oauth_version, oauth_token, oauth_verifier
Protected Resources 요청: oauth_consumer_key, oauth_callback, oauth_timestamp, oauth_nonce, oauth_signature_method, oauth_signature, oauth_version, oauth_token
oauth_signature 생성하기
HAC-SHA1 해시알고리즘을 사용하여 시그너처를 생성하는 방법을 알아보자. 각 파라미터들은 percent 인코딩 또는 Base64 인코딩을 하기전에 반드시 UTF-8 로 인코딩해야함을 주의하자.
이 알고리즘은 키를 바탕으로 데이터에 대한 해시 값을 생성하게 되는데, data는 Signature Base String 이 되며, key 는
Consumer Secret 와 Token Secret 를 & 문자로 연결한 값이 된다.
HMAC-SHA1의 데이터 생성 ( Signature Base String 생성)
생성 절차는 좀 까다로운데 절차는 다음과 같다.
① oauth_signature 파라미터를 제외한 oauth 파라미터들의 키와 값을 각각 percent 인코딩을 하고 =문자로 연결한다.
(HTTP request의 post body값이 존재하면 이 값도 동일한 연산을 수행한다)
② oauth 파라미터( 키=값) 쌍을 키의 알파벳순으로 정렬한 후 &문자로 연결하여 정규화된 문자열을 생성한다
(키가 동일하면, 값의 알파벳순으로 정렬함)
③ Request URL을 percent 인코딩한다.
④ HTTP request method(대문자) 와 인코딩된 Request URL, 그리고 정규화된 문자열을 & 문자로 연결하고, percent 인코딩하여
Signature Base String을 생성한다.
HMAC-SHA1의 키 생성
① consumer secret를 percent 인코딩한다
② token_secret를 percent 인코딩한다. (token_secret 은 Request Token 요청시에는 공백값이며, Access Token 요청시에는
Request token의 secret이며, 자원 요청시에는 Access Token의 secret 이 된다. )
③ 인코딩된 consumer secret 값과 token secret 값을 & 문자로 연결하여 최종 데이터를 생성한다.
Base64 인코딩으로 바이너리 값을 아스키 값으로 변경
위에서 생성한 키와 데이터를 바탕으로 HMAC-SHA1 알고리즘을 적용하면, signature 의 바이너리 값을 얻을 수 있다.
이 데이터에 Base64 인코딩을 적용하여, 아스키코드값으로 변경하고, 다시 percent 인코딩을 적용하여 최종 signature 값을
생성한다.
지금까지 생성한 oauth 파라미터드를 HTTP request의 헤더에 설정하고, 요청만 하면된다. 하지만 아직 한단계가 더 남아있다.
HTTP request 의 Authorization 헤더값를 생성하는 것이다.
Authorization 헤더값 생성
"OAuth " (공백이 있다는 것에 주의) 문자열과 모든 oauth 파라미터의 키와 쌍따옴표로 감싼 값쌍을 =문자료 연결하고 다시 각각을 ,(쉼표)문자로 연결한다
최종헤더 값은 다음과 같은 형태일 것이다.
OAuth oauth_callback="oob", oauth_timestamp="13882494", ......
이제는 거의 마지막 과정까지 왔다. 각각 생성한 oauth 파라미터의 키와 값, Authorization 헤더의 키와 값을 HTTP 헤더에 설정하고,
http 요청을 하면 된다. HTTP 헤더와 HMAC-SHA1의 키와 데이터를 표현한 그림은 다음과 같다.
HMAC-SHA1 알고리즘 키와 데이터에 인코딩 적용여부는 그림에 표현하지 않았다.
'네트워크로그' 카테고리의 다른 글
| [FTP] (2) 클라이언트 구현하기 (0) | 2011.03.09 |
|---|---|
| [FTP] (1) FTP(File Transmission Protocol) 프로토콜 이해 (0) | 2011.03.09 |
| 바이트 오더링(byte ordering) (0) | 2011.03.08 |
| OAuth의 세부사항 (0) | 2011.01.01 |
| OAuth의 개념과 대략적인 흐름 (0) | 2010.12.31 |