기계 간: Logto로 인증 (Authentication)
이 가이드는 Admin Console에서 "Machine-to-machine" 유형의 애플리케이션을 생성했다고 가정합니다.
소개
기계 간 (M2M)은 앱 (사용자가 아닌)이 리소스와 직접 통신해야 할 때 일반적으로 사용하는 인증 방법입니다 (일반적으로 M2M 앱은 사용자 상호작용이 필요 없으므로 UI가 없습니다). 예를 들어, Logto에서 사용자의 맞춤 데이터를 업데이트하는 API 서비스, 일일 주문을 가져오는 통계 서비스 등이 있습니다.
Logto는 역할 기반 접근 제어 (RBAC)를 접근 제어 정책으로 사용하므로, M2M 앱에 M2M 역할을 할당하여 직접 서비스 통신이 필요한 API를 보호하는 것이 필요합니다.
현재 RBAC 및 사용자 역할과 M2M 역할의 차이에 대해 알아보려면, 역할 구성을 참조하세요.
Logto에서 기계 간 앱을 사용하는 두 가지 일반적인 사용 사례가 있습니다:
- Logto Management API에 접근하기: 이 경우, 내장된 Logto Management API에서
all
권한을 포함하는 M2M 역할을 M2M 앱에 할당해야 합니다. - 자신의 API 리소스에 접근하기: 이 경우, 자신의 API 리소스에서 권한을 포함하는 M2M 역할을 M2M 앱에 할당해야 합니다.
M2M 앱 생성 과정에서, 애플리케이션에 M2M 역할을 할당할 수 있는 페이지로 안내됩니다:

또는 이미 M2M 앱이 생성된 경우, M2M 앱 상세 페이지에서 이러한 역할을 할당할 수도 있습니다:

이제 전체 과정을 살펴보겠습니다. 명확성을 위해 Logto Management API와 다른 API 리소스에 접근하는 단계를 분리하겠습니다. 그리고 Logto에서 이미 M2M 앱을 생성했다고 가정합니다.
액세스 토큰 가져오기
액세스 토큰 요청의 기본 사항
M2M 앱은 HTTP 요청 엔티티 본문에 application/x-www-form-urlencoded
형식으로 다음 매개변수를 추가하여 토큰 엔드포인트에 액세스 토큰을 가져오기 위해 POST
요청을 합니다:
- grant_type:
client_credentials
로 설정해야 합니다 - resource: 액세스하려는 리소스
- scope: 액세스 요청의 스코프
또한, 토큰 엔드포인트가 M2M 앱을 인증할 수 있도록 요청 헤더에 M2M 앱의 자격 증명을 포함해야 합니다.
이는 요청 Authorization
헤더에 기본 인증 (Basic authentication) 형식으로 앱의 자격 증명을 포함하여 달성됩니다. 여기서 사용자 이름은 App ID이고, 비밀번호는 App Secret입니다.
M2M 앱의 세부 정보 페이지에서 App ID와 App Secret을 찾을 수 있습니다:

액세스 토큰 요청의 예는 다음과 같습니다:
POST /oidc/token HTTP/1.1
Host: your.logto.endpoint
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials
&resource=https://shopping.api
&scope=read:products write:products
액세스 토큰 요청하기
다음 시연에서는 https://your.logto.endpoint
를 목표로 하는 Logto 엔드포인트로 교체하세요. Logto Cloud의 경우, https://{your-tenant-id}.logto.app
가 됩니다.
- Logto Management API용
- 자신의 API 리소스용
Logto는 내장된 "Logto Management API" 리소스를 제공합니다. 이는 Logto Management API에 접근하기 위한 all
권한을 가진 읽기 전용 리소스이며, API 리소스 목록에서 확인할 수 있습니다. 리소스 API 지표는 https://{your-tenant-id}.logto.app/api
형식으로 되어 있으며, 이는 액세스 토큰 요청 본문에서 사용되는 리소스 값이 됩니다.

Logto Management API에 접근하기 전에, M2M 앱이 이 내장된 "Logto Management API" 리소스에서 all
권한을 포함하는 M2M 역할이 할당되었는지 확인하세요.
Logto는 새로 생성된 테넌트에 대해 사전 구성된 "Logto Management API 접근" M2M 역할도 제공합니다. 이 역할에는 Logto Management API 리소스의 모든 권한이 이미 할당되어 있습니다. 수동으로 권한을 설정하지 않고 직접 사용할 수 있습니다. 이 사전 구성된 역할은 필요에 따라 편집 및 삭제할 수도 있습니다.
이제 모든 것을 조합하여 요청을 보내세요:
- Node.js
- cURL
const logtoEndpoint = 'https://your.logto.endpoint'; // Logto 엔드포인트로 교체하세요
const tokenEndpoint = `${logtoEndpoint}/oidc/token`;
const applicationId = 'your-application-id';
const applicationSecret = 'your-application-secret';
const tenantId = 'your-tenant-id';
const fetchAccessToken = async () => {
return await fetch(tokenEndpoint, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
Authorization: `Basic ${Buffer.from(`${applicationId}:${applicationSecret}`).toString(
'base64'
)}`,
},
body: new URLSearchParams({
grant_type: 'client_credentials',
resource: `https://${tenantId}.logto.app/api`,
scope: 'all',
}).toString(),
});
};
curl --location \
--request POST 'https://your.logto.endpoint' \
--header 'Authorization: Basic ${your_auth_string}' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=client_credentials' \
--data-urlencode 'resource=https://${tenantId}.logto.app/api' \
--data-urlencode 'scope=all'
실제 값을 자신의 것으로 교체하는 것을 잊지 마세요.
Logto Cloud 사용자에게: Logto Management API와 상호작용할 때는 사용자 정의 도메인을 사용할 수 없으며, 기본 Logto 엔드포인트 https://{your_tenant_id}.logto.app/oidc/token
을 사용하여 액세스 토큰을 부여받아야 합니다.
자신의 API 리소스 목록에서 앱이 접근해야 하는 API 식별자를 찾으세요. Logto에 API 리소스를 추가하지 않았거나 API 리소스가 무엇인지 모른다면, API 리소스를 참조하세요.

"온라인 쇼핑" API 리소스에서 read:products
및 write:products
권한이 있다고 가정합니다.
자신의 API 리소스에 접근하기 전에, M2M 앱이 자신의 API 리소스에서 권한을 포함하는 M2M 역할로 할당되었는지 확인하세요.
이제 우리가 가진 모든 것을 구성하고 요청을 보내세요:
- Node.js
- cURL
const logtoEndpoint = 'https://your.logto.endpoint';
const tokenEndpoint = `${logtoEndpoint}/oidc/token`;
const applicationId = 'your-application-id';
const applicationSecret = 'your-application-secret';
const fetchAccessToken = async () => {
return await fetch(tokenEndpoint, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
Authorization: `Basic ${Buffer.from(`${applicationId}:${applicationSecret}`).toString(
'base64'
)}`,
},
body: new URLSearchParams({
grant_type: 'client_credentials',
resource: 'https://shopping.api',
scope: 'read:products write:products',
}).toString(),
});
};
curl --location \
--request POST 'https://your.logto.endpoint/oidc/token' \
--header 'Authorization: Basic ${your_auth_string}' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=client_credentials' \
--data-urlencode 'resource=https://shopping.api' \
--data-urlencode 'scope=read:products write:products'
액세스 토큰 응답
성공적인 액세스 응답 본문은 다음과 같습니다:
{
"access_token": "eyJhbG...2g", // Logto Management API에 접근하기 위한 이 토큰을 사용하세요
"expires_in": 3600, // 토큰 만료 시간 (초 단위)
"token_type": "Bearer", // 액세스 토큰을 사용할 때 요청의 인증 유형
"scope": "all" // Logto Management API의 스코프 `all`
}
Logto는 현재 M2M 앱이 사용자를 나타내는 것을 지원하지 않습니다. 액세스 토큰 페이로드의 sub
는 앱 ID가 됩니다.
액세스 토큰을 사용하여 리소스에 접근하기
토큰 응답에 token_type
필드가 있으며, 이는 Bearer
로 고정되어 있음을 알 수 있습니다.
따라서 API 리소스 서버와 상호작용할 때 액세스 토큰을 Bearer 형식 (Bearer YOUR_TOKEN
)으로 HTTP 헤더의 Authorization
필드에 넣어야 합니다.
- Logto Management API와 상호작용하기
- 자신의 API 리소스와 상호작용하기
Logto의 모든 애플리케이션을 가져오기 위해 내장된 Logto Management API 리소스 https://[your-tenant-id].logto.app/api
와 함께 요청된 액세스 토큰 (Access token)을 사용하세요:
- Node.js
- cURL
const logtoEndpoint = 'https://your.logto.endpoint'; // Logto 엔드포인트로 교체하세요
const accessToken = 'eyJhb...2g'; // 액세스 토큰
const fetchLogtoApplications = async () => {
return await fetch(`${logtoEndpoint}/api/applications`, {
method: 'GET',
headers: {
Authorization: `Bearer ${accessToken}`,
},
});
};
curl --location \
--request GET 'https://your.logto.endpoint/api/applications' \
--header 'Authorization: Bearer eyJhbG...2g'
실제 값을 자신의 것으로 교체하는 것을 잊지 마세요. Bearer
뒤의 값은 받은 액세스 토큰 (JWT)이어야 합니다.
요청한 액세스 토큰을 사용하여 https://shopping.api
API 리소스에서 쇼핑 API의 모든 제품을 가져옵니다:
- Node.js
- cURL
const apiEndpoint = 'https://your.api.endpoint';
const accessToken = 'eyJhb...2g'; // 액세스 토큰
const fetchProducts = async () => {
return await fetch(`${apiEndpoint}/products`, {
method: 'GET',
headers: {
Authorization: `Bearer ${accessToken}`,
},
});
};
curl --location \
--request GET 'https://your.api.endpoint/products' \
--header 'Authorization: Bearer eyJhbG...2 # 액세스 토큰
인증 (Authentication)
Logto Management API 외의 자신의 API 리소스를 보호하는 경우, 리소스에 대한 인증을 구현해야 합니다. 자세한 내용은 API 보호하기를 참조하세요.