기계 대 기계 통신을 위한 API 리소스 보안
OAuth 2.0 및 JWT 를 활용하여 기계 대 기계 통신을 위한 API 리소스를 안전하게 보호하는 방법을 배워보세요.
여러 서비스가 포함된 프로젝트를 구축할 때, API 리소스의 보안은 중요한 문제입니다. 이 기사에서는 OAuth 2.0 및 JWT 를 활용하여 서비스 간의 통신(기계 대 기계)을 안전하게 보호하고, 최소 권한 원칙을 따르기 위해 역할 기반 접근 제어(RBAC)를 적용하는 방법을 보여드리겠습니다.
시작하기
따라가기 위해 다음과 같은 전제 조건이 있다고 가정합니다:
- Logto Cloud 계정 또는 자체 호스트된 Logto 인스턴스
- 서로 통신해야 하는 적어도 두 개의 서비스
데모 목적을 위해, 다음과 같은 서비스가 있다고 가정해봅시다:
- 장바구니를 관리하는 API 를 제공하는 쇼핑 카트 서비스
- 엔드포인트:
https://cart.example.com/api
- 엔드포인트:
- 결제를 처리하는 API 를 제공하는 결제 서비스
- 엔드포인트:
https://payment.example.com/api
- 엔드포인트:
인증 흐름
이제 우리 카트 서비스는 결제를 처리하기 위해 결제 서비스를 호출해야 합니다. 인증 흐름은 다음과 같습니다:
위의 다이어그램의 몇 가지 주요 개념:
- JWT (RFC 7519): JSON 웹 토큰. JWT 소개에 대한 이전 기사를 참조하세요.
- JWK (RFC 7517): JWT의 서명을 확인하는 데 사용되는 JSON 웹 키. JWK 세트는 여러 JWK의 집합입니다.
- "client_credentials" 승인 (RFC 6749): OAuth 2.0의 승인 타입. 클라이언트의 자격 증명을 사용하여 액세스 토큰을 얻습니다. 다음 섹션에서 세부 사항을 설명하겠습니다.
위의 다이어그램에서 각 참여자는 인증 흐름에서 역할을 수행합니다:
- 카트 서비스: 결제 서비스를 호출해야 하는 클라이언트입니다. 비록 서비스이지만 OAuth 2.0 컨텍스트에서는 여전히 클라이언트로, 이러한 클라이언트를 Logto 에서는 "기계 대 기계 애플리케이션"이라고 부릅니다.
- Logto: 액세스 토큰을 발급하는 OAuth 2.0 인증 서버입니다.
- 결제 서비스: 결제를 처리하는 API 리소스를 제공하는 서비스입니다.
이제 인증 흐름을 단계별로 살펴보겠습니다.
초기 설정
인증 흐름을 수행하려면, Logto 내에서 기계 대 기계 앱(카트 서비스)과 API 리소스(결제 서비스)를 만들어야 합니다.
API 리소스 생성
카트 서비스가 인증을 수행할 때 결제 서비스의 API 를 인식해야 하기 때문에 먼저 API 리소스를 생성 해야 합니다. Logto 콘솔로 이동하여 왼쪽 사이드바에서 API 리소스를 클릭하고 API 리소스 생성을 클릭합니다. 열린 대화 상자에서는 시작하는 데 도움이 되는 몇 가지 튜토리얼을 제공합니다. 튜토리얼 없이 계속하기를 클릭하여 생략할 수도 있습니다.
API 이름 및 식별자를 입력하세요, 예를 들면, 결제 서비스
및 https://payment.example.com/api
를 입력한 후, API 리소스 생성을 클릭합니다.
API 리소스를 생성한 후, 세부 페이지로 리디렉션됩니다. 지금은 그대로 두어도 괜찮습니다.
기계 대 기계 앱 생성
왼쪽 사이드바에서 애플리케이션을 클릭하고 애플리케이션 생성을 클릭합니다. 열린 대화 상자에서 기계 대 기계 카드를 찾아 시작하기를 클릭합니다.
애플리케이션 이름을 입력하세요, 예를 들어 카트 서비스
, 그런 다음 애플리케이션 생성을 클릭합니다. 애플리케이션 설정을 돕기 위한 인터랙티브 가이드가 표시됩니다. 기본 사용법 을 이해하려면 가이드를 따르거나, 완료하고 마치기를 클릭하여 생략할 수 있습니다.
액세스 토큰 요청
기계 대 기계 애플리케이션은 보안이 보장된 것을 가정하기 때문에 (예: 비공개 네트워크에 배포됨), OAuth 2.0 "client_credentials" 승인을 사용하여 액세스 토큰을 얻을 수 있습니다. 클라이언트를 인증하기 위해 기본 인증을 사용합니다:
- 요청 URL 은 Logto 인스턴스의 토큰 엔드포인트입니다. 기계 대 기계 앱의 세부 정보 페이지에서 고급 설정 탭에서 찾고 복사할 수 있습니다.
- 요청 메서드는
POST
입니다. - 요청
Content-Type
헤더는application/x-www-form-urlencoded
입니다. Authorization
헤더의 값은Basic <base64(app_id:app_secret)>
입니다, 여기서app_id
와app_secret
은 각각 기계 대 기계 앱의 앱 ID 와 앱 비밀입니다. 애플리케이션 세부 정보 페이지에서 찾을 수 있습니다.- 요청 본문은 승인 유형 및 API 식별자를 명시해야 합니다. 예를 들어,
grant_type=client_credentials&resource=https://payment.example.com/api
.grant_type=client_credentials
: