본문 바로가기

신입 개발자 면접 기초

OAuth2.0 구조와 동작 프로세스(feat. 생활코딩)

반응형

OAuth 2.0 구조와 동작 프로세스

* OAuth

OpenID로 개발된 표준 인증 방식, API인증과 사용자인증에 사용된다.

* OAuth를 사용하는 이유

보안의 수준을 알 수 없는 애플리케이션에서 일일이 계정을 만들어 사용하면 ID/PW관리가 어렵고 개인정보가 유출되면 연쇄적으로 피해가 심각해질 수 있기 때문에 보안의 수준이 어느정도 검증된 사이트(OAuth provider(ex. google, facebook))의 API를 이용해서 인증을 받는 방법(OAuth)이 보안상 좋기 때문이다.


* 참고로 비영리사이트 생활코딩(https://opentutorials.org)의 동영상을 보고 공부한 후 정리한 것임. 그림과 내용을 출처 역시 생활코딩 사이트입니다.


구조와 동작 프로세스

* 사전에 용어 정리

Resource server : 구글/페이스북같은 oauth 제공자, 어떤 사람의 자원(Resource)를 가지고 있음. 

client : 누군가 만든 애플리케이션(서버, 앱, TV...), Resource server에 요청하는 객체이기 때문에 사용자에게는 서버지만 client라고 함.

Resource owner : client의 서비스를 이용하는 사람, 이미 구글, 페이스북등에 가입된 사람으로 Resource server의 Resource owner이기 때문에 Resource owner라고 함.

+ client는 미리 resource server에 oauth인증을 사용하겠다고 요청 및 설정을 해야함. resource server는 client에게 client id과 client secret 을 줌, ip/pw라고 보면 됨.


* 동작 프로세스

(편의상 resource owner는 사용자, client는 내가 만든 웹 애플리케이션, Resource server는 구글이다.)

1. 사용자가 내가 만든 웹사이트에서 어떤 웹페이지에 접근하려고 요청한다.

2. 내 사이트에서는 인증이 되지 않은 사용자의 요청(request)을 받으면 "구글한테 인증받고 올래?" 하고 동의를 구하는 페이지를 띄운다.

3. 사용자가 동의를 누르면 구글로 인증 요청이 가게된다.

4. 구글에서는 로그인이 안되어있으면 로그인을 할 수 있는 화면을 보여주고, 로그인이 되어있으면 "내가 만든 웹사이트에서 너의 구글계정에 있는 어떤 정보(API정보)를 가져다 쓴다는데 동의할거야?" 라고 구글이 동의를 구하는 화면을 보여준다.

5. 사용자가 동의하면 구글은 바로 정보를 주지 않고 인증 코드를 웹사이트에 준다.

6. 인증코드를 받은 웹사이트에서는 기존에 웹서비스를 구글에 등록하면서 받은 client id(ID)와 client secret(PW), 그리고 인증코드를 보낸다. (총 3개의 정보)

7. 그러면 구글이 올바른 클라이언트(웹사이트)의 요청이었음을 검증했기 때문에 access token을 준다.

 - 이 access token을 받아야 드디어 웹사이트에서 사용자의 정보에 접근할 수 있음 *****

8. 이제 사용자의 요청에 따라 구글 계정의 정보(API)가 필요하면 구글에 access token을 내밀면서 정보를 받아다가 쓸 수 있다.


OAuth 프로세스 중 세부사항

* 2번의 화면에서 동의를 눌렀을 때 3번으로 가게하는 방법, 주소는 어떻게 얻을까?

https://accounts.google.com/o/oauth2/v2/auth?
 scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.metadata.readonly&
 access_type=offline&
 include_granted_scopes=true&
 state=state_parameter_passthrough_value&
 redirect_uri=http%3A%2F%2Foauth2.example.com%2Fcallback&
 response_type=code&
 client_id=client_id

google identity platform 에서 메뉴얼 제공함. 위의 주소로 링크시키면 됨.

scope : 구글의 어떤 정보를 가져올 것인지, url encode 필수(ex. calendar정보)

access_type : offline인지 online인지 정함, access token이 계속 쓸 수 있는게 아니라 만료 시간이 있는데 만료되었을 때 refresh token을 이용해서 기존의 access token을 지속적으로 사용할 수 있게 할 수 있다.

offline으로 설정하면 access token을 받을 때 refresh token을 받을 수 있음.

include_granted_scopes : 생략

state : 생략

redirect_uri : code를 클라이언트에게 보내야하는데 어디로 보내야 클라이언트가 받을 수 있니?, url encode 필수

 - redirect_uri는 미리 구글에 등록해놔야함. 그래야 구글이 아 여기로는 code를 보내도 안전하구나 함.

response_type : code

client_id : 우리가 받은 client_id

* 6번에서 구글에 정보 보내는 방법

POST /oauth2/v4/token HTTP/1.1
Host: www.googleapis.com
Content-Type: application/x-www-form-urlencoded

code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7&
client_id=your_client_id&
client_secret=your_client_secret&
redirect_uri=https://oauth2.example.com/code&
grant_type=authorization_code

해석해보면 POST 요청으로 https://www.googleapis.com/oauth2/v4/token 으로 code, client_id등을 보내란다.

주의할 점은 redirect_uri는 아까 code를 받은 redirect_uri와 같아야 한다.

참고로 6번을 통해 올바르게 정보를 넘겨주면 구글은 redirect하지 않고 그냥 access token의 값을 뿌려준다.

그러므로 redirect_uri는 code받을 때 쓰던 redirect_uri와 같아야 한다.

* 8번 access token 사용하는 방법

GET https://www.googleapis.com/drive/v2/files?access_token=<access_token>

받은 access token을 넣어 요청.


가장 BEST한 방법은 각 언어마다 제공되면 sdk를 이용하는 것이 좋다.

반응형