한국어
  • oauth
  • jwt
  • api
  • security
  • authentication
  • authorization
  • machine-to-machine

기계 대 기계 통신을 위한 API 리소스 보안

OAuth 2.0 및 JWT 를 활용하여 기계 대 기계 통신을 위한 API 리소스를 안전하게 보호하는 방법을 배워보세요.

Gao
Gao
Founder

여러 서비스가 포함된 프로젝트를 구축할 때, 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_idapp_secret은 각각 기계 대 기계 앱의 앱 ID 와 앱 비밀입니다. 애플리케이션 세부 정보 페이지에서 찾을 수 있습니다.
  • 요청 본문은 승인 유형 및 API 식별자를 명시해야 합니다. 예를 들어, grant_type=client_credentials&resource=https://payment.example.com/api.
    • grant_type=client_credentials: