OAuth 2.0 - authorization 방식

hyHA·2024년 1월 13일
0

OAuth 2.0은 웹 및 애플리케이션에서 안전하게 구글이나 네이버 같은 서드파티 애플리케이션접근 권한을 부여하기 위한 프로토콜이다.

예를 들어, 개발자의 웹사이트에서 사용자의 구글 캘린더를 보이도록 하고 싶을 때, 혹은 '구글로 로그인하기'와 같은 기능을 제공하고 싶을 때, OAuth 2.0를 이용한다.

OAuth는 사용자가 자신의 데이터를 안전하게 공유할 수 있도록 하는 표준적인 방법을 제공하고,
주로 인증(Authentication)과 권한 부여(Authorization)를 처리하는 데 사용된다.

OAuth 2.0에서 개발자가 어떻게 사용자의 승인을 받고, 사용자 대신 서드파티 애플리케이션에 정보를 얻어오는지 알아보도록 하자.

용어

아래에 사용될 용어는 다음과 같다.

👤 사용자 : 리소스 오너
🖥 개발자 (프로그램) : 클라이언트
🏢 서드파티 애플리케이션 : 리소스 서버

클라이언트 등록

먼저 🖥 클라이언트는 🏢 리소스 서버에 자신을 등록한다

  1. 클라이언트 → 리소스 서버 : 등록
    • 클라이언트와 리소스 서버가 공유하는 정보
      • client_id
      • client_secret
      • redirect_uri

등록 과정을 표로 정리하면 아래와 같다

클라이언트가 발급/획득한 정보리소스 서버가 발급/획득한 정보동작
등록client_idclient_id클라이언트 → 리소스 서버 : 등록
client_secretclient_secret
redirect_uri (전달)redirect_uri

인증 코드 발급

이 단계에서 리소스 오너(사용자)와 리소스 서버가 하는 활동은 아래와 같다.

  • 리소스 오너
    • 클라이언트가 요청한 로그인을 수행
    • 리소스 서버가 요청한 스코프 범위 동의
  • 리소스 서버가 확인하는 것
    • 등록된 클라이언트인지 확인 : client_id & redirect_uri 일치여부 확인 (보안)
    • 해당 클라이언트가 요청한 스코프의 범위 동의 여부 (목적)
  • 클라이언트가 얻는 것
    • 인증 코드

즉, (보안에 필요한 단계를 제외하면) 이 단계는 클라이언트가 인증코드를 얻기 위한 단계이다.

🖥 클라이언트는 👤 리소스 오너에게 구글 로그인하는 화면을 보여주고,
(로그인 단계에서 🏢 서버가 확인하는 정보는 user_id, scope 이다)
👤 리소스 오너의 로그인과 권한 승인이 완료되면 🏢 리소스 서버는 스코프 정보를 획득한다.


  1. 🖥 → 👤 : 🏢 로그인 승인 요청
  2. 👤 → 🏢 에 로그인
    • 🏢
      • client_id & redirect_uri 이 일치하는지 확인
      • 스코프의 권한을 클라이언트에게 줄 것인지 동의 요청
  3. 👤 → 🏢 : 허용
    • 리소스 서버 : user_id & scope 정보 획득
  4. 🏢는 authorization_code를 👤에게 전달하면서 🖥 redirect_uri로 리다이렉트 요청한다.
클라이언트가 획득한 정보리소스 서버가 획득한 정보동작
등록client_idclient_id클라이언트 → 리소스 서버 (등록)
client_secretclient_secret
redirect_uri (전달)redirect_uri
------------------------------------------------------
리소스 오너 승인user_id1. 클라이언트 → 리소스 오너 (리소스 서버 로그인 승인 요청)
scope2. 리소스 오너가 리소스 서버에 로그인
- 리소스 서버 'client_id, redirect_uri' 확인
3. 리소스 서버 → 리소스 오너에 '스코프 권한' 확인 요청
4. 리소스 오너 허용
- 리소스 서버 user_id&scope 정보 획득

엑세스 토큰 발급

이 단계에서 인증 서버가 하는 활동은 아래와 같다.

  • 인증 서버
    • 인증 코드의 값과 클라이언트 ID, 클라이언트 시크릿, 리다이렉트 uri 일치여부 확인(보안)
    • 토큰 발급
  • 클라이언트가 얻는 것
    • 토큰

즉, 이 단계는 엑세스 토큰을 얻기 위한 단계이다.

👤는 인지하지 못한채로,
🖥는 획득한 authorization_code와 기타 정보를 🏢에 전달한다(어떻게? 이후 찾아볼것)
🏢는 🖥가 보낸 정보가 자신이 가진 정보와 일치하는지 비교 후 엑세스 토큰을 발급한다.

  1. 🏢 → 👤 : redirect_uri + authorization_code로 리다이렉트 요청
    • 🏢 : authorization_code 발급
  2. 🖥 : 오너는 인지하지 못하지만 위 주소로 이동
    • authorization_code 획득
    • 리소스 서버에 아래 정보를 담아 요청
      • 리소스 서버 & authorization_code & redirect_uri & client_id & client_secret
  3. 🏢
    • authorization_code에 해당하는 client_id & client_secret & redirect_uri가 일치하는지 확인
    • 확인 후 authorization_code 삭제 ⇒ 그래야 또 인증을 안함?
    • 엑세스 토큰 발급
클라이언트가 획득한 정보리소스 서버가 획득한 정보동작
리소스 오너 승인user_id1. 클라이언트 → 리소스 오너 (리소스 서버 로그인 승인 요청)
scope2. 리소스 오너가 리소스 서버에 로그인
- 리소스 서버 'client_id, redirect_uri' 확인
3. 리소스 서버 → 리소스 오너에 '스코프 권한' 확인 요청
4. 리소스 오너 허용
- 리소스 서버 user_id&scope 정보 획득
--------------------------------------------------------------------------------------------------------
리소스 서버 승인authorization_codeauthorization_code (발급)(리소스 오너가 인지하지 못한 채로)
1. 리소스 서버 : 리다이렉트 요청
- 링크 : redirect_uri + authorization_code(발급)
2. authorization_code 획득한 클라이언트가 획득한 정보를 🏢에 전달
- client_secret, authorization_code 등
3. 정보 일치하는지 확인 후 엑세스 토큰 발급

유저 정보 제공

이 단계에서 리소스 서버가 하는 활동은 아래와 같다.

  • 리소스 서버
    • 토큰에 해당하는 리소스 오너의 정보 제공
  • 클라이언트가 얻는 것
    • 오너 정보

즉, 이 단계는 클라이언트가 유저 정보를 얻기 위한 단계이다.

  1. 🖥가 🏢으로 요청 시 accessToken에 해당하는 👤의 정보를 허용
클라이언트가 획득한 정보리소스 서버가 획득한 정보동작
리소스 서버 승인authorization_codeauthorization_code (발급)(리소스 오너가 인지하지 못한 채로)
1. 리소스 서버 : 리다이렉트 요청
- 링크 : redirect_uri + authorization_code(발급)
2. authorization_code 획득한 클라이언트가 획득한 정보를 🏢에 전달
- client_secret, authorization_code 등
3. 정보 일치하는지 확인 후 엑세스 토큰 발급
-------------------------------------------------------------------------------------------------
엑세스 토큰 발급accessTokenaccessToken (발급)authorization_code 삭제 후 토큰 발급

참고
https://www.youtube.com/watch?v=UH5XnjkBqKE&list=PLuHgQVnccGMA4guyznDlykFJh28_R08Q-&index=4
https://cheese10yun.github.io/oauth2/

profile
룰루랄라

0개의 댓글

관련 채용 정보