OAuth 2.0
OAuth 2.0이란?
웹 애플리케이션이나 모바일 애플리케이션에서 사용자 자원을 안전하게 액세스하기 위한 권한 부여 프레임워크
OAuth 2.0의 주요 요소
- Resource Owner (자원 소유자)
- 데이터를 소유하고 그에 대한 접근 권한을 부여할 수 있는 주체
- Client (클라이언트)
- Resource Owner의 데이터에 대한 접근을 요청하는 애플리케이션 또는 서비스
- Authorization Server (권한 서버)
- Resource Owner를 인증하고 Client에게 Access Token을 발급하는 서버
- Resource Server (자원 서버)
- 사용자의 데이터를 보유한 서버
- Access Token (접근 토큰)
- Client가 Resource Owner를 대신하여 Resource Server에 접근하는 데 사용하는 토큰
OAuth 2.0의 주요 단계
- Authorization Grant (권한 부여)
- Client가 Resource Owner의 권한을 얻기 위해 Authorization Server에 요청
- 이를 통해 얻은 권한 부여 코드를 사용하여 Access Token을 요청할 수 있음
- 주요 권한 부여 유형
- Authorization Code
- 가장 안전하고 일반적으로 사용되는 흐름
- Client는 사용자를 Authorization Server로 리디렉션하며, 사용자는 로그인하고 접근을 승인함
- Authorization Server는 사용자를 Client로 다시 리디렉션하며 권한 코드를 제공함
- Client는 이 코드를 Access Token으로 교환함
- Implicit
- Client 코드가 브라우저에서 실행되는 싱글 페이지 애플리케이션(SPA)에 사용됨
- Access Token이 중간 권한 코드 없이 직접 Client에게 반환됨
- 토큰이 사용자 에이전트에 노출되므로 보안성이 낮음
- Resource Owner Password Credentials
- Client가 직접 Resource Owner의 자격 증명(사용자 이름과 비밀번호)을 수집함
- Client가 매우 신뢰할 수 있을 때 사용되지만 자격 증명이 Client에 노출되므로 보안성이 낮음
- Client Credentials
- Client가 사용자를 대신하지 않고 자신의 자원에 접근할 때 사용됨
- Client가 Authorization Server에 자신을 인증하고 직접 Access Token을 얻음
- Authorization Code
- Client가 Resource Owner의 권한을 얻기 위해 Authorization Server에 요청
- Access Token:
- Authorization Server에서 발급된 토큰으로, Client가 Resource Server에 접근할 때 사용됨
- 이 토큰은 일정 시간 동안 유효함
- Refresh Token (리프레시 토큰):
- Access Token이 만료되었을 때 새로운 Access Token을 발급받기 위해 사용됨
- 주로 장기적인 세션을 유지하기 위해 사용됨
OAuth 2.0의 흐름
1. Authorization Code Grant (인가 코드 부여 방식)
시나리오: 타사 웹 애플리케이션이 사용자의 구글 드라이브 파일에 접근하려고 할 때
- Authorization Request:
- Client(타사 애플리케이션)는 사용자를 구글의 Authorization Server로 리디렉션하여 권한 요청을 함
- 사용자에게 로그인 및 권한 부여 화면이 표시됨
- Authorization Grant:
- 사용자가 권한을 승인하면, Authorization Server는 Client에게 권한 부여 코드를 반환함
- Access Token Request:
- Client는 이 권한 부여 코드를 사용하여 Authorization Server에 Access Token을 요청함
- Access Token Response:
- Authorization Server는 Access Token을 Client에게 발급함
- Resource Request:
- Client는 이 Access Token을 사용하여 구글 드라이브 API를 통해 파일에 접근함
2. Implicit Grant (암시적 부여 방식)
시나리오: 단일 페이지 애플리케이션이 사용자의 페이스북 프로필에 접근하려고 할 때
흐름:
- Authorization Request:
- Client(단일 페이지 애플리케이션)는 사용자를 페이스북의 Authorization Server로 리디렉션하여 권한 요청을 함
- 사용자에게 로그인 및 권한 부여 화면이 표시됨
- Authorization Grant:
- 사용자가 권한을 승인하면, Authorization Server는 Client에게 직접 Access Token을 반환함 (권한 부여 코드 생략)
- Resource Request:
- Client는 이 Access Token을 사용하여 페이스북 API를 통해 사용자 프로필에 접근함
3. Resource Owner Password Credentials Grant (Resource Owner 비밀번호 자격 증명 부여 방식)
시나리오: 모바일 애플리케이션이 사용자의 자체 백엔드 서버에 접근하려고 할 때
흐름:
- Password Credentials Request:
- 사용자는 Client(모바일 애플리케이션)에 자신의 사용자명과 비밀번호를 직접 입력함
- Access Token Request:
- Client는 이 사용자명과 비밀번호를 사용하여 Authorization Server에 Access Token을 요청함
- Access Token Response:
- Authorization Server는 Access Token을 Client에게 발급함
- Resource Request:
- Client는 이 Access Token을 사용하여 백엔드 서버의 자원에 접근함
4. Client Credentials Grant (Client 자격 증명 부여 방식)
시나리오: 서버-간 통신에서 Client가 자체적으로 API에 접근할 때
흐름:
- Access Token Request:
- Client는 자신의 Client ID와 비밀번호를 사용하여 Authorization Server에 Access Token을 요청함
- Access Token Response:
- Authorization Server는 Access Token을 Client에게 발급함
- Resource Request:
- Client는 이 Access Token을 사용하여 다른 서버의 보호된 자원에 접근함
보안 고려 사항
- Token Expiry(토큰 만료) 및 Refresh Tokens
- Access Token은 보통 수명이 짧음
- Refresh Token을 사용하여 사용자 개입 없이 새로운 Access Token을 얻을 수 있음
- Scope (범위)
- 클라이언트가 접근할 수 있는 Resource Owner의 데이터 부분을 정의
- Redirect URI Validation (리디렉트 URI 검증)
- Authorization Server가 피싱을 방지하기 위해 미리 등록된 URI로만 리디렉션하도록 함
- State Parameter (상태 매개변수)
- 요청과 콜백 사이의 상태를 유지하여 교차 사이트 요청 위조(CSRF) 공격으로부터 보호함
This post is licensed under CC BY 4.0 by the author.