OAuth 2.0은 웹 및 애플리케이션에서 안전하게 구글이나 네이버 같은 서드파티 애플리케이션
에 접근 권한을 부여하기 위한 프로토콜이다.
예를 들어, 개발자의 웹사이트에서 사용자의 구글 캘린더를 보이도록 하고 싶을 때, 혹은 '구글로 로그인하기'와 같은 기능을 제공하고 싶을 때, OAuth 2.0를 이용한다.
OAuth는 사용자가 자신의 데이터를 안전하게 공유할 수 있도록 하는 표준적인 방법을 제공하고,
주로 인증(Authentication)과 권한 부여(Authorization)를 처리하는 데 사용된다.
OAuth 2.0에서 개발자가 어떻게 사용자의 승인을 받고, 사용자 대신 서드파티 애플리케이션에 정보를 얻어오는지 알아보도록 하자.
아래에 사용될 용어는 다음과 같다.
👤 사용자 : 리소스 오너
🖥 개발자 (프로그램) : 클라이언트
🏢 서드파티 애플리케이션 : 리소스 서버
먼저 🖥 클라이언트는 🏢 리소스 서버에 자신을 등록한다
등록 과정을 표로 정리하면 아래와 같다
클라이언트가 발급/획득한 정보 | 리소스 서버가 발급/획득한 정보 | 동작 | |
---|---|---|---|
등록 | client_id | client_id | 클라이언트 → 리소스 서버 : 등록 |
client_secret | client_secret | ||
redirect_uri (전달) | redirect_uri |
이 단계에서 리소스 오너(사용자)와 리소스 서버가 하는 활동은 아래와 같다.
즉, (보안에 필요한 단계를 제외하면) 이 단계는 클라이언트가 인증코드를 얻기 위한 단계이다.
🖥 클라이언트는 👤 리소스 오너에게 구글 로그인
하는 화면을 보여주고,
(로그인 단계에서 🏢 서버가 확인하는 정보는 user_id, scope
이다)
👤 리소스 오너의 로그인과 권한 승인이 완료되면 🏢 리소스 서버는 스코프
정보를 획득한다.
authorization_code
를 👤에게 전달하면서 🖥 redirect_uri로 리다이렉트 요청한다. 클라이언트가 획득한 정보 | 리소스 서버가 획득한 정보 | 동작 | |
---|---|---|---|
등록 | client_id | client_id | 클라이언트 → 리소스 서버 (등록) |
client_secret | client_secret | ||
redirect_uri (전달) | redirect_uri | ||
-------------- | ------------------- | --------------------- | |
리소스 오너 승인 | user_id | 1. 클라이언트 → 리소스 오너 (리소스 서버 로그인 승인 요청) | |
scope | 2. 리소스 오너가 리소스 서버에 로그인 | ||
- 리소스 서버 'client_id, redirect_uri' 확인 | |||
3. 리소스 서버 → 리소스 오너에 '스코프 권한' 확인 요청 | |||
4. 리소스 오너 허용 | |||
- 리소스 서버 user_id&scope 정보 획득 |
이 단계에서 인증 서버가 하는 활동은 아래와 같다.
즉, 이 단계는 엑세스 토큰을 얻기 위한 단계이다.
👤는 인지하지 못한채로,
🖥는 획득한 authorization_code와 기타 정보를 🏢에 전달한다(어떻게? 이후 찾아볼것)
🏢는 🖥가 보낸 정보가 자신이 가진 정보와 일치하는지 비교 후 엑세스 토큰을 발급한다.
클라이언트가 획득한 정보 | 리소스 서버가 획득한 정보 | 동작 | |
---|---|---|---|
리소스 오너 승인 | user_id | 1. 클라이언트 → 리소스 오너 (리소스 서버 로그인 승인 요청) | |
scope | 2. 리소스 오너가 리소스 서버에 로그인 | ||
- 리소스 서버 'client_id, redirect_uri' 확인 | |||
3. 리소스 서버 → 리소스 오너에 '스코프 권한' 확인 요청 | |||
4. 리소스 오너 허용 | |||
- 리소스 서버 user_id&scope 정보 획득 | |||
------------- | -------------------- | --------------------- | -------------------------------------------------- |
리소스 서버 승인 | authorization_code | authorization_code (발급) | (리소스 오너가 인지하지 못한 채로) |
1. 리소스 서버 : 리다이렉트 요청 | |||
- 링크 : redirect_uri + authorization_code(발급) | |||
2. authorization_code 획득한 클라이언트가 획득한 정보를 🏢에 전달 | |||
- client_secret, authorization_code 등 | |||
3. 정보 일치하는지 확인 후 엑세스 토큰 발급 |
이 단계에서 리소스 서버가 하는 활동은 아래와 같다.
즉, 이 단계는 클라이언트가 유저 정보를 얻기 위한 단계이다.
클라이언트가 획득한 정보 | 리소스 서버가 획득한 정보 | 동작 | |
---|---|---|---|
리소스 서버 승인 | authorization_code | authorization_code (발급) | (리소스 오너가 인지하지 못한 채로) |
1. 리소스 서버 : 리다이렉트 요청 | |||
- 링크 : redirect_uri + authorization_code(발급) | |||
2. authorization_code 획득한 클라이언트가 획득한 정보를 🏢에 전달 | |||
- client_secret, authorization_code 등 | |||
3. 정보 일치하는지 확인 후 엑세스 토큰 발급 | |||
------------ | ------------------ | --------------------- | ---------------------------------------------- |
엑세스 토큰 발급 | accessToken | accessToken (발급) | authorization_code 삭제 후 토큰 발급 |
참고
https://www.youtube.com/watch?v=UH5XnjkBqKE&list=PLuHgQVnccGMA4guyznDlykFJh28_R08Q-&index=4
https://cheese10yun.github.io/oauth2/