OAuth의 세부사항

네트워크로그 2011. 1. 1. 03:05




지난 포스팅에 이어 OAuth의 세부사항에 대해 알아보자

① 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 알고리즘 키와 데이터에 인코딩 적용여부는 그림에 표현하지 않았다.