이 페이지에서는 사용자 및 서비스 주체가 Azure Databricks REST API를 사용하여 인증할 수 있도록 Microsoft Entra ID 액세스 토큰을 수동으로 생성하는 방법을 설명합니다. 수동 토큰 생성은 고급 기술입니다.
중요합니다
Databricks는 Microsoft Entra ID 토큰을 수동으로 만드는 것을 권장하지 않습니다. 1시간 이내에 만료되며 수동 교체가 필요합니다. 대신 통합 인증 과 함께 도구 또는 SDK를 사용하여 토큰 관리를 자동으로 처리합니다.
대부분의 사용 사례에 Azure Databricks 관리 서비스 주체 를 사용합니다. 추가 Microsoft Entra ID 권한이 필요하므로 Azure 리소스에 액세스해야 하는 경우에만 Microsoft Entra ID 관리 서비스 주체를 사용합니다.
수동 토큰 생성을 사용하는 경우
다음 경우에만 수동 토큰 생성을 사용합니다.
- Azure CLI 또는 통합 인증을 사용할 수 없는 시스템과 통합해야 합니다.
- 토큰 수명 주기 및 새로 고침을 명시적으로 제어해야 합니다.
- 인증 문제를 디버깅하고 있습니다.
다른 모든 사용 사례의 경우 토큰 관리를 자동으로 처리하는 권장 인증 방법을 사용합니다.
사용자에 대한 토큰 가져오기
Azure CLI 또는 MSAL(Microsoft 인증 라이브러리)을 사용하여 사용자에 대한 Microsoft Entra ID 액세스 토큰을 가져옵니다.
Azure CLI 메서드
사용자 계정에 대한 Azure 구독 ID를 가져옵니다.
Azure Databricks 작업 영역에서 다음을 수행합니다. 사용자 이름 >>를 클릭하고 구독 ID를 찾습니다.
Azure CLI를 사용하여 다음을 수행합니다. 다음 명령을 실행합니다(작업 영역 URL로 바꾸기).
az databricks workspace list --query "[?workspaceUrl==\`adb-0000000000000000.0.azuredatabricks.net\`].{id:id}" -o tsv # /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/my-rg/providers/Microsoft.Databricks/workspaces/my-ws다음은
00000000-0000-0000-0000-000000000000/subscriptions/구독 ID입니다.테넌트 오류가 발생하면 올바른 테넌트에 로그인합니다.
az login -t <tenant-id>
Azure에 로그인:
az login올바른 구독을 설정합니다.
az account set -s <subscription-id>액세스 토큰 생성:
az account get-access-token \ --resource 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d \ --query "accessToken" \ -o tsv리소스 ID
2ff814a6-3304-4ab8-85cb-cd0e6f879c1d는 모든 Azure 환경에서 Azure Databricks의 표준 식별자입니다.
MSAL 메서드
MSAL(Microsoft 인증 라이브러리)을 사용하여 프로그래밍 방식으로 Microsoft Entra ID 액세스 토큰을 가져옵니다. MSAL은 다음 두 가지 흐름을 지원합니다.
- 권한 부여 코드 흐름(대화형): 사용자 로그인을 위한 브라우저를 시작합니다. 2단계 또는 페더레이션 인증을 사용하도록 설정하거나 관리자 동의가 필요한 경우 이를 사용합니다.
- 사용자 이름 암호 흐름(프로그래밍 방식): 사용자 이름 및 암호를 사용하여 인증합니다. 프로그래밍 방식으로 로그인할 권한이 있는 경우에만 사용합니다.
MSAL을 사용하기 전에 Microsoft Entra ID에 애플리케이션을 등록해야 합니다. Azure Portal을 사용하여 앱 등록을 참조하세요. 등록할 때:
- 지원되는 계정 유형을이 조직 디렉터리의 계정으로만 설정합니다(단일 테넌트).
- 값이 있는 공용 클라이언트/네이티브(모바일 및 데스크톱)로
http://localhost를 설정합니다. - 앱 개요 페이지에서애플리케이션(클라이언트) ID 및 디렉터리(테넌트) ID를 확인합니다.
-
AzureDatabricks API 권한을 추가합니다.
- API 권한으로> 이동하여권한 추가
- AzureDatabricks를 검색하고 선택합니다.
- user_impersonation 사용하도록 설정하고 권한 추가를 클릭합니다.
- 관리자 동의 부여(관리자 권한 필요)를 클릭합니다.
인증 코드 흐름
MSAL Python SDK를 설치합니다.
pip install msal
다음 코드를 다음과 같이 get-tokens.py저장합니다.
from msal import PublicClientApplication
import sys
# Provide client ID and tenant ID as command-line arguments
client_id = sys.argv[1] if len(sys.argv) > 1 else '<client-id>'
tenant_id = sys.argv[2] if len(sys.argv) > 1 else '<tenant-id>'
scopes = ['2ff814a6-3304-4ab8-85cb-cd0e6f879c1d/.default']
app = PublicClientApplication(
client_id=client_id,
authority=f"https://login.microsoftonline.com/{tenant_id}"
)
result = app.acquire_token_interactive(scopes=scopes)
if 'error' in result:
print(f"Error: {result['error']}")
print(f"Description: {result['error_description']}")
else:
print(f"Access token:\n{result['access_token']}")
print(f"\nRefresh token:\n{result['refresh_token']}")
스크립트를 실행합니다.
python get-tokens.py <client-id> <tenant-id>
사용자 이름 암호 흐름
다음 코드를 다음과 같이 get-tokens-user.py저장합니다.
from msal import PublicClientApplication
import sys
client_id = sys.argv[1] if len(sys.argv) > 1 else '<client-id>'
tenant_id = sys.argv[2] if len(sys.argv) > 1 else '<tenant-id>'
username = sys.argv[3] if len(sys.argv) > 1 else '<username>'
password = sys.argv[4] if len(sys.argv) > 1 else '<password>'
scopes = ['2ff814a6-3304-4ab8-85cb-cd0e6f879c1d/.default']
app = PublicClientApplication(
client_id=client_id,
authority=f"https://login.microsoftonline.com/{tenant_id}"
)
result = app.acquire_token_by_username_password(
username=username,
password=password,
scopes=scopes
)
if 'error' in result:
print(f"Error: {result['error']}")
print(f"Description: {result['error_description']}")
else:
print(f"Access token:\n{result['access_token']}")
print(f"\nRefresh token:\n{result['refresh_token']}")
스크립트를 실행합니다.
python get-tokens-user.py <client-id> <tenant-id> <username> <password>
서비스 주체에 대한 토큰 가져오기
서비스 주체는 OAuth 2.0 클라이언트 자격 증명 흐름을 사용하며 일반 사용자와 다른 액세스 제어를 가질 수 있습니다.
서비스 주체 만들기
서비스 주체가 없는 경우 Azure Portal 또는 Azure CLI를 사용하여 만듭니다.
Azure 포털
- Azure Portal에 로그인합니다.
- 필요한 경우 디렉터리 + 구독을 사용하여 올바른 테넌트로 전환합니다.
- Microsoft Entra ID를 검색하여 선택합니다.
- +앱 등록>를 클릭합니다.
- 이름을 입력하고 이 조직 디렉터리에서만 계정을 선택합니다(단일 테넌트).
- 등록을 클릭합니다.
-
개요 페이지에서 다음 값을 복사합니다.
- 애플리케이션(클라이언트) ID
- 디렉터리(테넌트) ID
- 인증서 및 비밀>>로 이동합니다.
- 설명을 추가하고 만료 기간을 설정한 다음 추가를 클릭합니다.
- 클라이언트 비밀 값을 복사하고 안전하게 저장 합니다.
Azure 커맨드 라인 인터페이스 (CLI)
전체 지침 은 Azure CLI를 사용하여 Azure 서비스 주체 만들기 를 참조하세요.
토큰 생성
REST API 또는 Azure CLI를 사용하여 토큰을 생성합니다. 먼저 다음 정보를 수집합니다.
- 테넌트 ID: Microsoft Entra ID의 디렉터리(테넌트) ID
- 클라이언트 ID: Microsoft Entra ID의 애플리케이션(클라이언트) ID
- 클라이언트 암호: Microsoft Entra ID의 클라이언트 비밀 값
REST API 메서드
curl -X POST -H 'Content-Type: application/x-www-form-urlencoded' \
https://login.microsoftonline.com/<tenant-id>/oauth2/v2.0/token \
-d 'client_id=<client-id>' \
-d 'grant_type=client_credentials' \
-d 'scope=2ff814a6-3304-4ab8-85cb-cd0e6f879c1d%2F.default' \
-d 'client_secret=<client-secret>'
액세스 토큰은 access_token 응답 필드에 있습니다.
Azure CLI 메서드
Azure 구독 ID를 가져옵니다. 사용자에 대한 토큰 가져오기를 참조하세요.
서비스 주체 계정을 사용하여 로그인합니다.
az login \ --service-principal \ -t <tenant-id> \ -u <client-id> \ -p <client-secret>올바른 구독을 설정합니다.
az account set -s <subscription-id>액세스 토큰 생성:
az account get-access-token \ --resource 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d \ --query "accessToken" \ -o tsv
Databricks API와 함께 토큰 사용
토큰을 생성한 후 Databricks REST API와 함께 사용합니다.
작업 영역의 서비스 주체
서비스 주체 API 또는 Databricks CLI를 사용하여 서비스 주체가 작업 영역에 이미 추가된 경우:
Databricks 명령줄 인터페이스 (CLI)
databricks clusters list -p <profile-name-with-token>
curl
curl -X GET \
-H 'Authorization: Bearer <access-token>' \
https://<databricks-instance>/api/2.0/clusters/list
Azure 역할이 있는 서비스 주체
서비스 프린시플이 Azure 작업 영역 리소스의 Contributor 역할 또는 Owner 역할을 가지고 있지만, 아직 Azure Databricks 작업 영역에 포함되지 않은 경우:
Azure Resource Manager에 대한 관리 토큰을 가져옵니다.
curl -X POST -H 'Content-Type: application/x-www-form-urlencoded' \ https://login.microsoftonline.com/<tenant-id>/oauth2/token \ -d 'client_id=<client-id>' \ -d 'grant_type=client_credentials' \ -d 'resource=https%3A%2F%2Fmanagement.core.windows.net%2F' \ -d 'client_secret=<client-secret>'두 토큰을 모두 사용하여 Databricks API를 호출합니다.
curl -X GET \ -H 'Authorization: Bearer <databricks-access-token>' \ -H 'X-Databricks-Azure-SP-Management-Token: <management-access-token>' \ -H 'X-Databricks-Azure-Workspace-Resource-Id: /subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.Databricks/workspaces/<workspace-name>' \ https://<databricks-instance>/api/2.0/clusters/list
첫 번째 인증 후에 서비스 주체는 작업 영역 관리자가 됩니다.
토큰 새로 고침
액세스 토큰으로 새로 고침 토큰을 가져온 경우 이를 사용하여 새 토큰을 가져옵니다. Microsoft Entra ID 액세스 토큰은 기본적으로 60-90분 후에 만료됩니다.
다음 코드를 다음과 같이 refresh-tokens.py저장합니다.
from msal import PublicClientApplication
import sys
client_id = sys.argv[1] if len(sys.argv) > 1 else '<client-id>'
tenant_id = sys.argv[2] if len(sys.argv) > 1 else '<tenant-id>'
refresh_token = sys.argv[3] if len(sys.argv) > 1 else '<refresh-token>'
scopes = ['2ff814a6-3304-4ab8-85cb-cd0e6f879c1d/.default']
app = PublicClientApplication(
client_id=client_id,
authority=f"https://login.microsoftonline.com/{tenant_id}"
)
result = app.acquire_token_by_refresh_token(
refresh_token=refresh_token,
scopes=scopes
)
if 'error' in result:
print(f"Error: {result['error']}")
print(f"Description: {result['error_description']}")
else:
print(f"\nNew access token:\n{result['access_token']}")
print(f"\nNew refresh token:\n{result['refresh_token']}")
스크립트를 실행합니다.
python refresh-tokens.py <client-id> <tenant-id> <refresh-token>
토큰 문제 해결
이 섹션에서는 일반적인 토큰 오류 및 액세스 토큰의 유효성을 검사하는 방법을 설명합니다.
사용자 이름 및 암호를 사용하여 토큰을 가져오지 못했습니다.
The user or administrator has not consented to use the application with ID <client-id>.
Send an interactive authorization request for this user and resource.
솔루션:AzureDatabricks 리소스가 애플리케이션에 추가되어 있는지 확인합니다. 권한 부여 코드 흐름(대화형 방법)을 사용하여 권한에 동의합니다. 동의한 후에는 사용자 이름 암호 흐름을 사용할 수 있습니다. 사용자에 대한 토큰 가져오기를 참조하세요.
리디렉션 URI가 일치하지 않음
The reply URL specified in the request does not match the reply URLs configured for the application: '<application-id>'
솔루션: 요청의 리디렉트 URI가 애플리케이션에 설정된 것과 일치하는지 확인하세요.
액세스 토큰 유효성 검사
Microsoft Entra ID 액세스 토큰에 올바른 정보가 포함되어 있는지 확인합니다. 토큰 유효성 검사를 참조하세요.
-
aud:
2ff814a6-3304-4ab8-85cb-cd0e6f879c1d(Databricks 리소스 ID) -
iss:
https://sts.windows.net/<tenant-id>/ - tid: 작업 영역 테넌트 ID
- nbf/exp: 현재 시간은 이러한 값 사이에 있습니다.
- unique_name: 사용자가 작업 영역에 있음
OIDC 엔드포인트에서 공용 인증서를 사용하여 서명의 유효성을 검사합니다.
서명 확인 없이 디코딩:
다음 코드는 토큰의 페이로드를 보여줍니다. 먼저 PyJWT 라이브러리를 pip install pyjwt를 사용하여 설치하고, 암호화 라이브러리를 pip install cryptography를 사용하여 설치해야 합니다.
import jwt
def decode_token(token):
algorithm = jwt.get_unverified_header(token)['alg']
decoded = jwt.decode(token, algorithms=[algorithm], options={"verify_signature": False})
for key in decoded.keys():
print(f"{key}: {str(decoded[key])}")
서명 확인을 사용하여 디코딩:
import jwt
import requests
from cryptography.x509 import load_pem_x509_certificate
from cryptography.hazmat.backends import default_backend
PEMSTART = '-----BEGIN CERTIFICATE-----\n'
PEMEND = '\n-----END CERTIFICATE-----\n'
def get_public_key_for_token(kid):
response = requests.get('https://login.microsoftonline.com/common/.well-known/openid-configuration').json()
pubkeys = requests.get(response['jwks_uri']).json()['keys']
for key in pubkeys:
if key['kid'] == kid:
cert_str = PEMSTART + str(key['x5c'][0]) + PEMEND
cert_obj = load_pem_x509_certificate(bytes(cert_str, 'ascii'), default_backend())
return cert_obj.public_key()
def aad_access_token_decoder(access_token):
header = jwt.get_unverified_header(access_token)
public_key = get_public_key_for_token(header['kid'])
decoded = jwt.decode(access_token, key=public_key, algorithms='RS256',
audience='2ff814a6-3304-4ab8-85cb-cd0e6f879c1d')
for key in decoded.keys():
print(f"{key}: {str(decoded[key])}")