OAuth 2.0
Intro
안녕하세요. 왕슬기 대리입니다. OAuth 2.0과 OAuth를 이용한 Google api 연동 방법을 정리하였습니다.
OAuth 2.0(Open Authorization 2.0)
- 인증이나 접근 위임을 위한 개방형 표준 프로토콜
- 서비스 이용자(Resource Owner)를 대신하여 서비스를 요청할 수 있도록 자원 접근 권한을 위임하는 방법
OAuth 2.0 용어
구분 | 설명 |
---|---|
Resource Owner | 자원 소유자, Client가 제공하는 서비스 이용 및 Resource Server의 계정을 소유하고 있는 사용자 |
Client | 클라이언트, Resource Owner의 리소스를 사용하고자 접근 요청을 하는 어플리케이션 |
Authorization Server | 권한 서버, Client가 Resource Server의 서비스를 사용할 수 있게 인증하고 토큰을 발행해주는 권한 서버 |
Resource Server | 자원 서버, Resource Owner의 정보가 저장되어 있는 서버 |
OAuth 2.0 인증 흐름도
(A) Client가 Resource Owner에게 승인 요청. Resource Owner에게 직접 인증 요청을 하거나 간접적으로 Authorization Server에 요청할 수 있음
(B) Client는 Resource Owner의 권한을 나타내는 자격 증명 권한을 받으며, 문서에 정의된 네 가지 권한 유형 중 하나를 사용하거나 확장된 권한 타입을 사용
인증 권한 타입은 Client가 인증을 요청할 때 사용하는 메소드나 Authorization Server가 지원하는 타입에 의존함
(C) Client가 Authorization Server로 인증하고 권한 부여 표시하여 Access Token 요청
(D) Authorization Server가 Client와 유효한 인증 권한인지 확인 후, 유효한 경우 Access Token 발급
(E) Client가 Resource Server에서 보호 된 리소스를 요청하고 서버에 Access Token 인증
(F) Resource Server가 Access Token의 유효성을 검사하고 유효한 경우 요청 처리
OAuth 2.0 권한 승인 방법
- 권한 코드 승인 (Authorization Code Grant)
- 권한 부여 승인을 위해 자체 생성한 Authorization Code를 전달하는 방식으로 가장 많이 쓰이는 기본 방식
- 간편 로그인 기능에서 사용되는 방식으로 Client가 사용자를 대신하여 특정 자원에 접근을 요청할 때, 보통 타사의 Client에게 보호된 자원을 제공하기 위한 인증에 사용
-
Refresh Token 사용 가능
- 암묵적 승인 (Implicit Grant)
- 자격증명을 안전하게 저장하기 힘든 Client(JavaScript 등의 스크립트 언어를 사용하는 브라우저)에 최적화된 방식
- 권한 부여 승인 코드 없이 바로 Access Token이 발급됨
- Access Token이 바로 전달되므로 누출의 위험을 방지하기 위해 만료기간을 짧게 설정하여 전달
- Refresh Token 사용 불가
-
Access Token 발급 절차 간소화로 응답성과 효율성은 높지만 Access Token이 URL로 전달되는 단점이 있음
- 자원 소유자 비밀번호 자격증명 승인 (Resource Owner Password Credentials Grant)
- username, password로 Access Token을 받는 방식
-
Refresh Token 사용 가능
- 클라이언트 자격증명 승인 (Client Credentials Grant)
- Client의 자격증명만으로 Access Token을 획득하는 방식
- Client 자신이 관리하는 리소스 혹은 Authorization Server에 해당 Client를 위한 제한된 리소스 접근 권한이 설정되어 있는 경우 사용
-
Refresh Token 사용 불가
OAuth2.0 도입에 따른 이점
- Resource Owner가 Client에게 비밀번호를 제공할 필요가 없으며, 피싱 위험 감소
- Client 개발자는 Resource Owner의 비밀번호에 대한 안전한 저장 및 노출을 고려하지 않아도 됨
- Resource Owner의 모든 권한이 아닌, Client에게 필요한 권한만 제한적으로 제공 가능
- 자원에 대한 Client의 접근을 각 Client 별로 차단 및 권한 취소가 가능하며, 권한의 범위 제어 가능
OAuth를 이용하여 Google API(Calendar) 연동하기
Client 등록
- Google Cloud platform으로 접속한 후 새 프로젝트 만들기를 클릭
- 프로젝트 이름을 입력 후 [만들기]
- 왼쪽 메뉴 중 [API 및 서비스] - [사용자 인증 정보] - [사용자 인증 정보 만들기] - [OAuth 클라이언트 ID] - [동의 화면 구성]버튼 클릭
- [외부] 선택 후 [만들기]
- 앱 이름, 사용자 지원 이메일, 개발자 연락처 정보 등록 후 [저장 후 계속]
- [범위 추가 또는 삭제] - email, profile, openid 선택 후 [업데이트] - [저장 후 계속]
- 테스트 사용자는 따로 추가 필요 없으므로 [저장 후 계속] - [대시보드로 돌아가기]
- 테스트 [앱 게시] 클릭
- 다시 왼쪽 메뉴 중 [사용자 인증 정보] - [사용자 인증 정보 만들기] - [OAuth 클라이언트 ID]
- 애플리케이션 유형 : 웹 애플리케이션 이름: 프로젝트 이름 입력 승인된 리디렉션 URI : callback URI 입력. 인증 후 이 URI로 리다이렉션됨 [만들기] 클릭
- 클라이언트 ID와 클라이언트 보안 비밀번호 생성
- 다시 왼쪽 메뉴 중 [API 및 서비스] - [라이브러리] 사용할 API 및 서비스 검색 - 해당 API 클릭 - [사용] 클릭
Resource Owner의 승인
- Resource Owner는 Resource Server의 기능을 사용하기 위해 client에 로그인 요청
- Client는 아래 url 호출
- scope는 api reference 문서에서 확인
- 리디렉션 URI와 클라이언트 ID는 [사용자 인증 정보]에서 확인
- access_type이 offline일 경우 refresh_token 발급 가능, online일 경우 발급 불가
https://accounts.google.com/o/oauth2/v2/auth? scope=[사용할 api의 scope]& access_type=offline& include_granted_scopes=true& response_type=code& state=state_parameter_passthrough_value& redirect_uri=[리디렉션 URI]& client_id=[클라이언트 ID] https://accounts.google.com/o/oauth2/v2/auth? scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar.readonly%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar& access_type=offline&include_granted_scopes=true&response_type=code& state=state_parameter_passthrough_value& redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Ftest.html& client_id=902424973173-ts51ukkdvrdig6499lb4g1bgipoj4huc.apps.googleusercontent.com
- 로그인 여부에 따라 Resource Server가 Resource Owner에게 로그인 요청
- 로그인에 성공하면 Resource Server는 위 주소의 client_id 값이 등록되어 있고, redirect_uri이 같은지 확인
- Resource Server는 Resource Owner에게 권한 허용 여부 확인
- 권한 허용 시 Resource Server는 Resource Owner가 허용한 내역 저장
Resource Server의 승인
-
Resource Server는 임시 비밀번호인 authorization code를 발급 후 Client에 전달(response)
[리디렉션 URI]? state=state_parameter_passthrough_value& code=[authorization code]& scope=[사용할 api의 scope] http://localhost:8080/test.html? state=state_parameter_passthrough_value& code=4/0AX4XfWiTfTEGXa27UCpPKzjs54s038kR-L68LyVJBFp6ZeTJ-MoqXgqgCD206Xk7RhXBXA& scope=https://www.googleapis.com/auth/calendar.readonly%20https://www.googleapis.com/auth/calendar
-
Client는 accessToken을 발급 받기 위해 Resource Server로 client_id, client_secret, redirect_uri, authorization_code 데이터 request
POST /token HTTP/1.1 Host: oauth2.googleapis.com Content-Type: application/x-www-form-urlencoded code=[authorization code]& client_id=[클라이언트 ID]& client_secret=[클라이언트 secret]& redirect_uri=[리디렉션 URI]& grant_type=authorization_code
-
Resource Server는 모든 정보가 일치하는지 확인, authorization code 삭제 후 accessToken 발급
{ "access_token": "ya29.A0ARrdaM9Bo-Ao8BY9XSDtsmWM89vOfu3Brb0ImEM5B27CJknHDW0sCDteV3nNdEVALK_sFXsDzU6Q9kXeVjOFDdSdAM-UkTmtQCcWNRWcYW2D3Ypjnv6Qtke6eOshgfHt1KxoBFmFiN9i-3YmuWu22ql7Ggud", "expires_in": 3599, "refresh_token": "1//0egK3yL45eukhCgYIARAAGA4SNwF-L9IrKOEBR7lZDn7EJCYUyLz5Tr6l6sY6B11lE37Ptl0E3Utoq_Eg45D95fuXHeTS-jFfX3g", "scope": "https://www.googleapis.com/auth/calendar https://www.googleapis.com/auth/calendar.readonly", "token_type": "Bearer" }
API 호출
-
api reference 문서를 참고하여 api 호출
GET /calendar/v3/users/me/calendarList HTTP/1.1 Host: www.googleapis.com Authorization: Bearer [access_token] GET https://www.googleapis.com/calendar/v3/users/me/calendarList?access_token=[access_token]
Refresh Token
- Access token은 유효기간이 있기 때문에 기간이 만료되면 api 호출 불가
-
Refresh token으로 Access token 갱신 가능
POST /token HTTP/1.1 Host: oauth2.googleapis.com Content-Type: application/x-www-form-urlencoded client_id=[클라이언트 ID]& client_secret=[클라이언트 secret]& refresh_token=[refresh_token]& grant_type=refresh_token
참고 문서
OAuth 2.0 공식 사이트 https://oauth.net/2/
OAuth 2.0 표준 문서 https://datatracker.ietf.org/doc/html/rfc6749
생활코딩 - OAuth 2.0 https://opentutorials.org/course/2473/16571
구글 인증 프로토콜 https://developers.google.com/identity/protocols/oauth2/web-server
구글 클라우드 플랫폼 https://console.developers.google.com/?hl=ko
OAuth 2.0 개념 정리 https://charming-kyu.tistory.com/36?category=1027392
Leave a comment