OAuth의 개념과 대략적인 흐름

네트워크로그 2010. 12. 31. 19:41




트위터 관련 앱을 개발하면서 정보수집을 하는중에 트위터 서비스에 있는 특정 데이터를 사용하기 위해서는 
OAuth 란 인증과정을 거쳐야 된다는 것을 알게되었다. 트위터 뿐만이 아니라,  스프링 노트와 페이스북 등 대부분의
웹서비스에서 OAuth를 사용하여 써드파티들이 데이터에 접근할 수 있도록 되어 있었다.  각 웹서비스에서는 OAuth 인증과정을
나름대로 설명해주고 있지만,  그 정보만을 가지고 구현하기는 생각보다 쉽지 않아보였다.  공개된 많은 소스와 OAuth 스펙을 참고
하여 나름대로 정리해 보았다. SNS 써드파티에 관심있는 사람들에게 조금이라도 도움이 되었으면 한다. 

OAuth
OAuth 는 Open Authorization 의 약자로 API를 사용하여 자원에 접근하기 위한 오픈 표준이다. 즉
SNS 와 같은 웹서비스에 있는 자원(데이터)을 사용자의 인증정보 없이도 써드파티에서 사용할 있도록 하기위한 오픈 표준이다.  사용자의 아이디와 비밀번호를 통한 명시적인 인증정보 대신 사용자가 개인자원에 접근을 허용했다는 표시인 토큰을 발행하여,  써드파티에서 접근할 수 있게하는 것이다. 

OAuth 프로토콜은 2007년 초반경에 처음 초안이 작성되어 2010 년 4월에 RFC 5849 : The OAuth 1.0 Protocol 로 등록이 되었다. 

OAuth를 통해 써드파티에서 궁극적으로 획득하는 것은 사용자의 자원에 대한 접근허용을 표시하는 액세스 토큰이다. 
이점을 염두하고 자주 언급되는 용어에 대해 알아보자.  트위터를 예로 들어 설명하겠다. 


OAuth 용어
Service  Provider : 서비스 프로바이더는 자원을 제공하는 웹서비스를 의미한다.  트위터 또는 페이스북 서비스를 의미한다. 
Consumer : 서비스 프로바이터의 자원에 접근하는 써드파티 웹사이트/애플리케이션을 의미한다. 
Protected Resource :  트윗글과 팔로워 목록과 같은 서비스 프로바이더가 보유한 데이터를 의미한다. 
Consumer Key/Secret :  서비스 프로바이더는 자신들의 서비스에 써드파티들이 접근할 수 있도록 하는데, 이때 각 써드파티들을 고유하게 식별하기 위한 값이 Consumer Key 이며,  그에 대한 확인을 위한 값이 Consumer Secret  이다. (아이디/비밀번호와 유사)
Request Token : 액세스 토콘과 교환하기 위한 사용자의 승인이 떨어지지 않은 토큰이다. 토큰은 key와 secret으로 구성된다. 
Access Token : 사용자에 의해 승인된 토큰으로,  이 토큰을 소유하면 해당사용자의 자원을 사용할 수 있게 된다. 
OAuth Parameter : OAuth 인증을 위해 필요한 파라미터 값으로, oauth_ 라는 접두어로 시작한다.  


OAuth 의 간략한 흐름 
크게 3가지 단계로 나눌 수 있다. 
① ServiceProvider 가 제공하는 Request token URL에 접속하여, Request Token을 요청하여 얻는다. 
    이 값은 Access Token과 교환하기 위한 값이며, 아직은 사용자의 승인이 되지 않은 토큰 값이다. 
② ServiceProvider 가 제공하는 Authorize URL에 접속하면서  Request Token 값을 전달하면, 사용자의 인증페이지를
    볼수 있게된다. 사용자가 (로그인을 하고)  접근허용을 하면, Verifier 값을 얻을 수 있게된다. 
   (이 때,  Consumer 가 웹서비스 또는 애플리케이션인지에 따라 Verifier 값을 다르게 수신하게 된다. 
    웹서비스라면, ServiceProvider 에게  제공한 callback 주소로 리다이렉트 되면서 Verifier가 전달되며, 
    애플리케이션이면,  리다이렉션 없이 pincode를 발급해준다. 이 pincode를 추출하여 Verifier 로 사용한다. )
③ ServiceProvider 가 제공하는 Access token URL로 접속하여, Request Token 과 Verifier를 함께 전달하면 
    Access Token을 얻을 수 있게된다. 
④ 획득한 Access Token을 사용자의 계정에 따라 저장하여, 이후에 자원에 접근하기 위한 값으로 사용할 수 있다. 

OAuth 인증과정은 4가지 과정으로 단순하다. 하지만 인증과정을 어렵게 보이게 하는 것은 ②번 과정을 제외한 나머지 
과정에서 URL 요청시 적절한 oauth 파라미터 값들을 생성하여, 보내주어야 하기 때문이다.  이 하나하나 파라미터 값들을
올바로 생성하기 위해서는 ServiceProvider 와 스펙에서 요구하는 사항을 준수하여야 한다. 지금은 세부 사항들은 무시하고, 
크게 4가지 단계를 거치게 된다는 것만 이해하자. 위 흐름을 간략히 그림으로 나타내 보았다. 



사용자의 계정별로 ①,②,③ 번 과정은 한번만 수행하면 되며,  이후 ④ 을 조회하기 위해 사전에 획득한 Access Token을 
사용하게 된다.  (물론 ServiceProvider에 따라 Access Token을 특정기간 동안에만 유효하게 할 수 있는데, 그럴 경우 일정주기마다 
①,②,③ 번 과정을 다시 거쳐야 한다. )



지금까지 OAuth 의 개념과 대략적인 흐름을 알아보았다. 다음 포스팅에서는 각 단계별로 필요한 oauth 파라미터들과 파라미터를
생성하는 방법, 그리고 실제 구현까지 해보겠다.