-
[OAuth2.0] OAuth2.0 개요생활코딩/WEBn 2020. 9. 30. 17:57
[강의 출처] opentutorials.org/course/3405
OAuth2.0란?
- 언제: 사용자(Resource Owner)가 나의 서비스(Client)를 이용할 때,
- 무엇을: 나의 서비스가 사용자가 이용하는 다른 서비스(구글이나 페이스북 등 Resource Server)와 상호작용할 수 있도록
- 구글 캘린더에 이벤트를 대신 추가해준다거나
- 어떻게: 다른 서비스쪽에서 사용자 로그인 정보를 받아서, 나의 서비스에게 특정 권한을 부여한 accessToken을 발급하여
- 왜: 인증을 보안 이슈 없이 안전하게 처리할 수 있는 방식
OAuth2.0 순서
- Client가 Resource Server에 등록(register)한다.
- Client ID(아이디), Client Secret(비밀번호), Authorized redirect URIs(인증 후 사용자가 확인하게 될 페이지, 다른 URI에서 요청이 들어오면 인증 거부된다)
- Client는 Resource Owner가 로그인할 수 있도록, 자신의 페이지에 리다이렉트 버튼을 만든다.
- 리다이렉트 경로는 이런 형식이다: https://resource.server/?client_id=id&scope=B&redirect_uri=https://redirect.uri
- Resource Server에서 제공하는 기능을 scope라고 한다. 위의 예시는 기능 B에 대한 요청.
- Resource Owner가 Client의 버튼을 통해 로그인하고, 권한을 허용한다.
- Resource Owner가 리다이렉트 버튼을 통해 접속을 시도하면, Resource Server는 로그인 여부를 확인한다.
- 로그인이 완료되면, Resource Server는 client_id값과 일치하는 id값이 있는지 확인하고,
- id가 존재한다면 해당 client_id의 redirect URL이 맞는지를 확인한다. 아니라면 거기서 종료.
- URL이 일치한다면, Resource Server는 해당 scope에 대한 권한을 허용할 것인지 Resource Owner에게 묻는다.
- Resource Owner가 권한을 허용하면 다음 단계로 진행, 아니라면 거기서 종료.
- Resource Server(Authorization Server)는 Client 승인 과정을 거쳐 accessToken을 발급한다.
- Resource Server는 authorization code(임시 비밀번호)를 발급해 Resource Owner에게 전송한다.
- authorization code는 redirect시에 header location값으로 https://client/callback?code=3 형태로 전송된다.
- Resource Owner가 해당 페이지로 redirect하면, Client는 code를 획득하여 아래처럼 Resource Server에 접속한다
- https://resource.server/token?grant_type=authorization_code&code=3&redirect_uri=http://redirect.uri&client_id=id&client_secret=2 (다른 방식으로 전달하면 grant_type이 다를 수 있다)
- Resource Server는 Client가 전송한 code, id, secret, redirect uri가 모두 일치하는지 확인한 다음,
- Resource Owner의 계정에 대해 scope 범위의 권한이 허용된 accessToken을 발급한다.
- accessToken을 획득한 Client는 Resource Server에서 제공한 API를 호출해서 요청을 처리한다.
- API는 Resource Server의 개발자페이지 등에서 찾을 수 있다.
- 만약 쿼리스트링으로 되어있는 경우, 이런 형식이다:
- https://www.googleapis.com/calendar/v3/users/me/calendarList?access_token=token
- Authorization Bearer의 경우, Bearer 부분을 헤더값으로 전송한다:
- curl -H "Authorization: Bearer <access_token>" https://url (curl는 웹페이지를 텍스트 형태로 보여준다)
- 만약 accessToken이 만료되었다면, Client는 Refresh token을 전송해서 accessToken을 갱신한다.
- Refresh token은 accessToken 발급시에 함께 발급해주는 것이 일반적이다.
- accessToken이 만료되면, Client가 client_id, client_secret, refresh token을 Resource Server에게 전송하고,
- 정보가 맞다면 Resource Server는 새 accessToken과 유효기간을 반환해준다.
'생활코딩 > WEBn' 카테고리의 다른 글
[Node.js & MySQL] 데이터 처리방식: 파일 -> MySQL 이식 (0) 2020.12.09 [Node.js & MySQL] Intro, 환경설정 (0) 2020.11.03 [DNS] Domain Name System 개요 (0) 2020.09.28 [Node.js] 입출력 데이터의 보안 이슈 (0) 2020.09.18 [Node.js] 인코딩 - encodeURI(), charset=utf-8 (0) 2020.09.17