간단히 공부하는 OAuth

이번 프로젝트 중에 OAuth를 구현하는 프로젝트가 있어 늘 궁금했지만, 그리고 늘 해야한다고 생각만 했던 OAuth에 대해 공부한 내용을 최대한 간단하고 간결하게 이야기해보려고 한다.

OAuth 1.0 ? 2.0?

왜 다들 2.0 만 사용하는지 궁금했는데, 간단히 요약하면,
2.0은 Https에게 보안을 전가 하고 인증에만 중심을 두겠다는거고,
1.0은 http던 https던 ftp던 뭐던 상관없이 (독립적으로) 인증을 하기위해 직접 보안을 신경써서 전송하겠다는 거다.

그 외의 명칭이 다르거나 다소 차이점은 있지만 가장큰 차이점은 위에서 말한 전송 방식에 대한 보안을 어떻게 신경쓰느냐 인 것 같다.

OAuth2.0 그리고 지옥으로 가는 길 과 같은 2.0은 위험하다! 라는 이야기도 있지만, 그러면 구글이 아직 까지 쓰고 있지 않을테니 여기서 가장 위험하다고 말해지는 https가 아닌 http를 사용할 경우의 위험만 신경쓰고 OAuth2.0는 https 상에서 통신 한다는 것만을 잊지 말자.

통신 순서

늘 어느 글을 가나 나오는 통신 순서다.

OAuth2 Overview | OAuth2

라고 하는데 솔직히 이것만 봐도 그리고 설명을 쭉 봐도 이해가 잘 되지 않는다.
그래서 그냥 내 나름 대로 정리해 보려고 한다.

목표와 명칭 정리

나는 내가 운영하는 사이트에 페이스북 로그인을 넣으려고 한다.
그럴때 아래와 같은 명칭을 가진다.

Resource Owner: 로그인 하는 사람이다.
Client: 내가 운영하는 사이트다.
Resource Server: 페이스북이다.
Authorization Server: 인증서버인데. 그냥 Resource Server와 통합되있다고 생각하자.

1. OAuth 준비

먼저 난 페이스북 개발자 사이트에 가서 Client id와 Client secret key를 발급 받는다.

2. 로그인 페이지에 페이스북 로그인 버튼을 추가한다.

이제 처음 들어오는 유저가 페이스북 로그인을 클릭하고,

최초 접속이니 내 서버의 Client id와 함께 해당 유저를 페이스북 OAuth 인증 페이지로 리다이렉트 한다.

늘 보던 이런거

확인을 누르면 callback URL으로 임시 패스워드[Authorization code]를 전달한다.

3. 내 서버에서 Access Token 발급 요청

서버는 임시 패스워드와[Authorization code]
내 서버의 client id, secret key를 가지고 Access Token을 발급 요청을 한다.
(혹은 Refresh token도 함께 받는다) 그리고 저장한다.

4. 내 서버에서 Access Token을 사용해 사용자 데이터에 접근한다.

발급 받은 Access Token을 사용해 사용자에 데이터에 접근할 수 있다.
그 정보로 로그인 내 서버에 로그인 시켜주면된다.

다만, 일정 시간이 지나면 Access Token이 만료되기에 Refresh Token을 사용하여 재발급 받는다.

이때 Refresh Token은 영구적으로 안별할 수 도 있고, 재발급 받을 때 마다 Refresh Token도 재발급 될 수 있다. 이는 각 사이트 정책을 따른다.

+α 이미 정보가 저장 되있으면?

그럼 위 2번에서 바로 내 서버의 callback url로 임시 패스워드가[Authorization code] 보내지고 Access Token을 가지고 혹은 갱신해서 로그인 정보를 가지고 올 수 있다.

즉 확인 버튼 누르는 과정만 없어졋다고 생각 해도 된다.


여튼 여러가지 설명이 있는데 내가 이해한 방식은 위와 같은 방식이고,
OAuth를 이해 하는데 도움이 되었으면 좋겠다.