2015년 4월 24일 금요일

Android : OAuth

OAuth


OAuth는 계정정보(ID/PW)를 이용한 인증 방식의 경우, API사용 시 계정 노출의 위험을 방지하기 위해 대안으로 나온 방식입니다.
(이전의 여러가지 인증 방식들이 존재하였으나 표준화되지 않고 각각의 회사마다 다른 방식의 인증을 제공하였습니다.
하지만 컨슈머(써드파티앱)의 입장에선 여러 플랫폼으로부터 서비스를 제공받으려면 
여러가지 인증 수단을 학습해야했던 불편함을 OAuth라는 표준 프로토콜을 이용함으로써 편리해졌습니다.)

Facebook, 포스퀘어, Google, Microsoft, LinkedIn의 경우엔 OAuth 2.0방식을 이용하며,
Naver, Twitter, Vimeo등의 경우엔 OAuth 1.0a 방식을 이용합니다.

OAuth 1.0a의 경우 HMAC_SHA1 알고리즘과 base64 암호화를 이용해 서명을 생성합니다.(굉장히 복잡하단 것이 단점..)
검증 작업시 서비스 제공자의 성능 이슈들이 있으며, 사용 중 생기는 여러가지 요구 사항들을 처리하기 위해 확장을 시도하지만, 한계에 부딪힙니다.
ex) Auto Refresh Token, Long-Live Token 등의 구현 제약

그 후 OAuth 2.0은 1.0a의 복잡함 및 확장 한계등의 단점을 보완하여 나왔습니다. (아직 드래프트 단계로써, 최종안이 나오지 않음)
ex) Auto Refresh Token, Long-Live Token 구현 가능!
인증 아키텍쳐 및 접근법등은 그대로이지만 하지만 새로운 프로토콜로 나오게 되면서 이전버전과의 하위호환을 제공하지 않습니다.
Client에서 HMAC_SHA1등의 암호화 서명을 걷어내고, HTTPS 프로토콜을 이용하게 됩니다.
(이 과정에서 HTTPS의 보안 취약점이 이슈로 거론 됩니다)

OAuth 1.0a는 다음과 같은 방식으로 서비스됩니다.
1) 컨슈머가 서비스제공자에게 Request Token 확인 요청.
2) 서비스제공자는 컨슈머의 Request Token을 받아 등록 된 컨슈머인지 확인.
3) 서비스제공자는 컨슈머에게 Access Token을 발급해주어도 되는지 유저에게 확인(로그인 및 권한 부여)
4) 이후 컨슈머는 이 Access Token을 이용해 서비스제공자에게 API 요청.

Request Token을 발급받기 위해선 다음과 같은 파라미터들이 필요합니다.
oauth_callback (서비스제공자가 인증 완료 후 리다이렉트할 컨슈머의 URL. 웹이 아닌 환경은 Out Of Band를 통해 리다이렉트 하지 않을 수 있습니다)
oauth_consumer_key (컨슈머 고유 키값. 서비스제공자로부터 발급받아 사용할 수 있습니다)
oauth_nonce (컨슈머에서 임의로 생성한 값. 악의적 목적의 요청 방지를 위함이며 중복이 불가능합니다)
oauth_timestamp (요청 생성 시점의 시간을 나타냅니다. 현재시간 - 1970.01.01/00:00:00을 초로 환산하여 넣어줍니다.
oauth_version (버젼을 의미합니다. 1.0a / 2.0 등등)
oauth_signature_method (signature 암호화 방법을 명시해줍니다. ex: HMAC-SHA1)
oauth_signature (signature을 제외한 모든 파라미터와 HTTP method, URL을 조합하여 암호화 한 값이 됩니다)


이하 1.0a 사용 방법은 naver open api를 기준으로 작성합니다.

Request Token 요청 시 URL입니다. (http://helloworld.naver.com/helloworld/24942 참조)
GET http://nid.naver.com/naver.oauth?mode=req_req_token&
oauth_callback=http://example.com/OAuthRequestToken.do&
oauth_consumer_key=WEhGuJZWUasHg&
oauth_nonce=zSs4RFI7lakpADpSsv&
oauth_signature=wz9+ZO5OLUnTors7HlyaKat1Mo0=&
oauth_signature_method=HMAC-SHA1&
oauth_timestamp=1330442419&
oauth_version=1.0 HTTP/1.1

Response parameter는 다음과 같습니다.
http://myapp.example.com/callback/callback.nhn?oauth_token=REQUEST_TOKEN&oauth_verifier=VERIFIER_CODE

Access Token을 발급받기 위해선 다음과 같은 파라미터들이 필요합니다.

파라미터 이름설명비고
mode네이버의 OAuth 인증 단계의 구분은 mode의 파라미터 값으로 구분합니다.
Request Token 발급 : req_req_token
사용자 인증 : auth_req_token
Access Token 발급 : req_acc_token
auth_req_token고정
oauth_consumer_key네이버 개발자 센터에서 발급 받은 Consumer Key 값입니다.Consumer Key 값
oauth_token2.3 단계에서 발급받은 “인증 받은 Request Token” 입니다.
oauth_signature_method서명문을 생성하기 위해 사용하는 메소드입니다.HMAC-SHA1 고정
oauth_timestamp요청을 하는 시점의 타임 스탬프로, 1970년 1월 1일부터 시작한 초 단위의 숫자입니다.
타임 스탬프의 값은 항상 이전에 사용한 타임 스탬프의 값보다 커야 합니다.
oauth_nonce컨슈머에서 생성하는 임의적인 문자열로 동일한 타임 스탬프에서는 유일한
값이어야 합니다.
oauth_versionOAuth의 버전 정보입니다.1.0 고정
oauth_verifierCallback URL에 대해 입증한 값
oauth_signature위의 OAuth 인증 정보를 HMAC-SHA1 서명 후, Base64 인코딩을 통해
생성한 서명 값이며, Signature Base String 작성 규칙에 의해 만듭니다.


Access Token 요청 시 URL입니다.
GET http://nid.naver.com/naver.oauth?mode=auth_req_token&
oauth_consumer_key=WEhGuJZWUasHg&
oauth_nonce=zSs4RFI7lakpADpSsv&
oauth_signature=wz9+ZO5OLUnTors7HlyaKat1Mo0=&
oauth_signature_method=HMAC-SHA1&
oauth_timestamp=1330442419&
oauth_version=1.0 HTTP/1.1&
oauth_verifier=zSs4RFI7lakpADpSsv&
oauth_token=zSs4RFI7lakpADpSsv


Response Parameter는 다음과 같습니다
oauth_token=OAUTH_TOKEN&oauth_token_secret=OAUTH_TOKEN_SECRET&id=enc(naverID)

이후 획득한 Access Token을 사용하여 API를 요청할 수 있습니다.

HTTP 헤더엔 GET/POST와 같은 메소드가 아닌 HEAD방식으로 Authorization 필드를 주어야 합니다.
카페의 메뉴리스트를 가져오는 예제 URL입니다.
POST /cafe/getMenuList.xml HTTP/1.1
Authorization: OAuth oauth_consumer_key="dpf43f3p2l4k3l03",oauth_token="nSDFh734d00sl2jdk"
,oauth_signature_method="HMACSHA1",oauth_timestamp="1379123202",oauth_nonce="chapoH",oauth_signature="MdpQcU8iPSUjWoN%2FUDMsK2sui9I%3D"
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Host: http://openapi.naver.com




댓글 없음:

댓글 쓰기