OAuth?

OAuth?

OAuth란

어떤 사이트에서 로그인을 진행할 경우에 Facebook이나 Twitter의 계정을 이용하여 인증을 진행하는 방법을 말한다. 즉, OAuth라는 별도의 인증절차를 거치면 다른 서비스에서 Facebook이나 Twitter의 일부 기능을 사용할 수 있다. (이러한 인증 과정에서 반드시 Facebook이나 Twitter의 계정만을 사용해야 하는 것이 아님)

OAuth의 ‘Auth’는 ‘Authentication(인증)’ 뿐만 아니라 ‘Authorization(허가, 권한)’ 또한 포함하고 있는 것.


내가 이해한 OAuth

OAuth는 인증을 위한 오픈 스탠더드 프로토코롤, 사용자가 Facebook이나 Twitter같은 인터넷 서비스의 기능을 다른 애플리케이션(데스크톱, 웹, 모바일 등)에서도 사용할 수 있게 한 것을 말한다고 한다.

OAuth의 탄생 이전에도 다른 애플리케이션에 사용자의 아이디와 암호가 노출되지 않도록 하면서 API 접근 위임(API Access Delegation)이 가능한 여러 인증 방법이 있었다고 한다. 그러나 표준안이 없다는 것을 알게되었고 OAuth를 만들고 공유하게 된 것이다.


OAuth와 로그인

OAuth와 로그인은 분명히 다른 기능이고 이를 분리해서 이해를 해야 함.

사원증을 이용해 출입할 수 있는 회사의 경우, 외부손님이 회사를 방문할 때

  • 회사 사원이 건물에 출입하는 것 = 로그인
  • 방문증을 수령한 후 회사에 출입하는 것 = OAuth

라고 생각할 수 있다. 그럼 적절한 예를 들어보도록 하자.

  1. 나방문씨(외부 손님)가 안내 데스크에서 업무적인 목적으로 김목적씨(회사 사원)를 만나러 왔다고 말한다.
  2. 안내 데스크에서는 김목적씨에게 나방문씨가 방문했다고 연락한다.
  3. 김목적씨가 안내 데스크로 찾아와 나방문씨의 신원을 확인해 준다.
  4. 김목적씨는 업무 목적과 인적 사항을 안내 데스크에서 기록한다.
  5. 안내 데스크에서 나방문 씨에게 방문증을 발급해 준다.
  6. 김목적씨와 나방문씨는 정해진 장소로 이동해 업무를 진행한다.

위 과정은 방문증 발급과 사용에 빗대어서 OAuth 발급 과정과 권한을 이해할 수 있도록 한 것임.

그림 1. AccessToken 시퀀스 다이어그램


위에서 말했듯이, OAuth에서 Auth는 ‘Authentication(인증)’ 뿐만 아니라 ‘Authorization(허가, 권한)’ 또한 포함하고 있는 것이다. 그렇기 때문에 OAuth 인증을 진행할 때, 해당 서비스 제공자는 ‘제 3자가 어떤 정보나 서비스에 사용자의 권한으로 접근하려 하는데 허용하겠느냐’라는 안내 메시지를 보여 주는 것이다. 자신의 인증을 하기 위해 제 3자에게 비밀번호를 전송하는 것이 아니라 기존에 인증을 받던 곳에서 일종의 ‘인증서’를 전달해 인증을 받는 것이다.


OAuth에서 사용되는 용어들

User - Service Provider에 계정을 가지고 있으면서, Consumer를 이용하려는 사용.

Consumer - OAuth 인증을 사용해 Service Provider의 기능을 사용하려는 애플리케이션이나 웹 서비스.

Service Provider - OAuth를 사용하는 Open API를 제공하는 서비스.

Request Token - Consumer가 Service Provider에게 접근 권한을 인증받기 위해 사용하는 값. 인증이 완료된 후에는 Access Token으로 교환한다.

Access Token - 인증 후 Consumer가 Service Provider의 자원에 접근하기 위한 키를 포함한 값.


아래는 인증 과정을 그림으로 나타낸 것이다.

인증과정
( 원본출처 : http://oauth.net/core/diagram.png )


앞에서 예시로 든 상황을 OAuth인증 과정과 연결지으면 아래와 같다.

  1. 나방문씨가 안내 데스크에서 업무적인 목적으로 김목적씨를 만나러 왔다고 말한다. - Request Token의 요청과 발급
  2. 안내 데스크에서는 김목적씨에게 나방문씨가 방문했다고 연락한다. - 사용자 인증 페이지 호출
  3. 김목적씨가 안내 데스크로 찾아와 나방문씨의 신원을 확인해 준다. - 사용자 로그인 완료
  4. 김목적씨는 업무 목적과 인적 사항을 안내 데스크에서 기록한다. - 사용자의 권한 요청 및 수락
  5. 안내 데스크에서 나방문 씨에게 방문증을 발급해 준다. - Access Token 발급
  6. 김목적씨와 나방문씨는 정해진 장소로 이동해 업무를 진행한다. - Access Token을 이용해 서비스 정보 요청 (방문증 = Access Token)


Request Token

Request Token을 발급하는 과정은 위의 예시에서 김목적씨에게 만나러 왔다고 알리는 1번 부분에 해당한다.

아래는 Request Token을 받는 과정에서의 헤더 값이다.

GET https://alpha-id.payco.com/oauth2.0/authorize? client_id={client_id}& redirect_uri=http://nhnent.dooray.com/auth/signin/process/payco?nextUrl=%2F& response_type=code& serviceProviderCode=DOORAY& termsYN=Y& state={random_string}

get 메소드로 payco사이트의 oauth에 요청을 하고 있다.

여기에서 state값은 보안을 위해 존재하는 값이고, Client_id은 요청을 보낸 클라이언트의 아이디를 말한다.


사용자 인증 페이지의 호출

OAuth에서 사용자 인증을 하는 부분은 김목적씨에게 안내데스크에 사람이 기다리고 있으니 와서 확인하라는 2번과 부합한다. Request Token을 요청하면, Service Provider는 Consumer에 Request Token을 전달한다. (Access Token을 받기 위해서도 Request Token을 사용한다)

사용자의 인증은 김목적씨가 내려와 나방문씨의 신원을 확인해주는 부분인 3번을 말한다. 사용자 인증 페이지를 호출하고 인증이 성공적으로 확인되면 사용자의 Request Token을 이용해 Access Token을 요청한다.


Access Token 요청하기

Access Token을 요청하는 방법은 Request Token을 요청하는 방법과 거의 비슷하다. 다른점은 매개변수의 종류와 인증서 생성시에 사용하는 키가 다르다는 점이다.

Access Token을 발급받기 위한 매개변수들을 잘 정의하고 값을 입력한다음 Access Token을 요청하면 token과 token_secret을 전달받게 된다.(Service Provider에 따라 사용자의 아이디나 프로필 정보 등을 저장한다.)


Access Token 사용하기

Access Token이 발급되면 인증을 진행할 수가 있다. Service Provider의 기능을 사용할 수 있다는 말이다. 페이코에서 받아온 Access Token에는 아래와 같은 값들이 들어가 있을 것이다.

{
“access_token_secret” : “4XIFI6WV08rPbgzl”, “state” : null, “expires_in” : “1209600”, “token_type” : “Bearer”, “access_token” : “AAAA4NV74n+ns623iceBuM1MfWzb3iq5kNfC4cMZ0A5T5pGjwfMF5b/Yj+LyDBqK8+/jvVTIKHbzM47wFw8qUf0fTCw4+/ko+hSgAGClMLy
kvaDJ7/0B/OxlMmkml2hJPQp96DqV6AqkvAw4niLVho14Izga2c5IksQOjTTv5L8keM4yTplN50xzGzYJpV1vmj3NGWtPKHaJL3fLVa41hvZm
xOw00edQeOYAw/vhLW7iQDuJjpTciWgmgEUd9if7EL+tqIJmE6fRSH42b4aNOX5XgiaEr6hUDisUoHG5kqOd”, “refresh_token” : “AAAAb7F2pdU0FZuxHreJDA2TnpkyB5fw8vwRwdaQaMaEKDwlspr/
LIsbLGHdW85lVuJ3OaNDguDnGx5+FZeZaIbBTDRBcaneT9WlrDNORX8eyVf5bgL6RrENn5tKhjdjQlmsXxH1wCJDUa2J2QtQOHRTxAg=” }

Access Token을 이용해 인증을 할 수 있지만 이 인증은 제한시간이 expires_in으로 표시되어 있다.

이 인증시간이 지나면 현재 발급되었던 Access Token을 다시 사용할 수 없으므로 새로고침을 할 경우에는 Access Token을 사용하지 않고 Refresh Token을 이용하여 다시 Access Token을 갱신받는다.

Access Token으로 인증을 진행하고 난 다음에 사용자의 정보가 필요하면 다시 Access Token을 이용하여 User의 Profile 사진이나 정보 등을 받아와야 할 것이다.