Note
이 기능은 현재 프라이빗 미리 보기에 있으므로 모든 클라이언트가 mTLS PoP 인증서를 가져올 수 있는 것은 아닙니다.
인증서 토큰 바인딩(mTLS PoP - 상호 TLS 소유 증명이라고도 함)은 액세스 토큰을 특정 X.509 인증서에 암호화하여 바인딩하는 고급 보안 기능입니다. RFC 8705 는 이 바인딩에 대해 설명합니다. 바인딩은 토큰이 가로채더라도 공격자가 해당 프라이빗 키를 소유하지 않고는 사용할 수 없도록 합니다.
토큰 바인딩의 작동 방식 이해
다음 단계에서는 획득에서 확인을 통한 토큰 바인딩 흐름에 대해 설명합니다.
- 토큰 획득: 토큰 바인딩을 사용하도록 설정된 액세스 토큰을 요청할 때 Microsoft ID 웹은 토큰 요청에 인증서의 지문을 포함합니다.
-
토큰 바인딩: 권한 부여 서버는 인증서의 SHA-256 지문
cnf()을 포함하는 발급된 토큰에 (확인) 클레임을 포함합니다x5t#S256. - API 호출: 클라이언트는 다운스트림 API를 호출할 때 바인딩된 토큰과 인증서를 모두 제공합니다.
-
확인: API는 제공된 인증서가 토큰 클레임의
cnf인증서 참조와 일치하는지 확인합니다.
sequenceDiagram
participant Client
participant EntraID as Microsoft Entra ID
participant API
Client->>EntraID: Token request with certificate thumbprint
EntraID->>Client: Token with cnf claim (bound to certificate)
Client->>API: MTLS_POP token + Client certificate
API->>API: Validate token and certificate binding
API->>Client: Protected resource
보안 혜택 검토
토큰 바인딩은 애플리케이션을 보호하는 데 다음과 같은 이점을 제공합니다.
- 토큰 도난 방지: 도난당한 토큰은 해당 인증서 없이는 쓸모가 없습니다.
- 재생 공격 방지: 다른 클라이언트에서 토큰을 재생할 수 없습니다.
- 향상된 인증: 기존 OAuth2 흐름과 "가지고 있는 것"(인증서)을 결합합니다.
- 제로 트러스트 아키텍처: 특정 디바이스에 자격 증명을 바인딩하여 zero trust 원칙에 맞춥니다.
토큰 바인딩 구성
mTLS PoP 토큰 바인딩을 사용하도록 클라이언트 애플리케이션과 API 서버를 모두 설정합니다.
클라이언트 애플리케이션 구성
다음 단계를 완료하여 토큰 바인딩에 대한 클라이언트 애플리케이션을 구성합니다.
1. Microsoft Entra ID 설정 구성
appsettings.json에 있는 Microsoft Entra 설정을 인증서를 포함하여 구성하십시오.
{
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"TenantId": "your-tenant-id",
"ClientId": "your-client-id",
"ClientCredentials": [
{
"SourceType": "StoreWithDistinguishedName",
"CertificateStorePath": "CurrentUser/My",
"CertificateDistinguishedName": "CN=YourCertificate"
}
],
"SendX5c": true
}
}
2. 토큰 바인딩을 사용하여 다운스트림 API 구성
MTLS_POP 프로토콜 체계를 사용하여 다운스트림 API 섹션을 구성합니다.
{
"DownstreamApi": {
"BaseUrl": "https://api.contoso.com/",
"RelativePath": "api/data",
"ProtocolScheme": "MTLS_POP",
"RequestAppToken": true,
"Scopes": [ "api://your-api-scope/.default" ]
}
}
중요 구성 속성:
-
ProtocolScheme: 토큰 바인딩을"MTLS_POP"사용하도록 설정해야 합니다. -
RequestAppToken:true인 애플리케이션 토큰이어야 합니다 (토큰 바인딩은 현재 애플리케이션 토큰만 지원합니다) -
Scopes: 다운스트림 API 호출에 필요한 API 범위
3. 서비스 등록
애플리케이션의 시작 코드에 다운스트림 API 서비스를 등록합니다. 다음 예제에서는 콘솔 앱과 ASP.NET Core 방법을 모두 보여 줍니다.
using Microsoft.Identity.Web;
var builder = WebApplication.CreateBuilder(args);
// Option 1: Using TokenAcquirerFactory (for console apps, background services)
var tokenAcquirerFactory = TokenAcquirerFactory.GetDefaultInstance();
tokenAcquirerFactory.Services.AddDownstreamApi(
"DownstreamApi",
tokenAcquirerFactory.Configuration.GetSection("DownstreamApi"));
var serviceProvider = tokenAcquirerFactory.Build();
// Option 2: Using ASP.NET Core DI (for web apps, web APIs)
builder.Services.AddAuthentication()
.AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"));
builder.Services.AddDownstreamApi(
"DownstreamApi",
builder.Configuration.GetSection("DownstreamApi"));
API 서버 구성
다운스트림 API는 토큰과 인증서 바인딩의 유효성을 모두 검사해야 합니다. 전체 예제는 다음과 같습니다.
1. 인증 처리기 등록
using Microsoft.Identity.Web;
var builder = WebApplication.CreateBuilder(args);
// Add standard JWT Bearer authentication
builder.Services.AddMicrosoftIdentityWebApiAuthentication(builder.Configuration);
// Add custom MTLS_POP authentication handler
builder.Services.AddAuthentication()
.AddScheme<AuthenticationSchemeOptions, MtlsPopAuthenticationHandler>(
"MTLS_POP",
options => { });
var app = builder.Build();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
app.Run();
2. mTLS PoP 인증 처리기 구현
using System.Security.Claims;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text.Encodings.Web;
using System.Text.Json;
using Microsoft.AspNetCore.Authentication;
using Microsoft.Extensions.Options;
using Microsoft.IdentityModel.JsonWebTokens;
using Microsoft.IdentityModel.Tokens;
public class MtlsPopAuthenticationHandler : AuthenticationHandler<AuthenticationSchemeOptions>
{
public const string ProtocolScheme = "MTLS_POP";
public MtlsPopAuthenticationHandler(
IOptionsMonitor<AuthenticationSchemeOptions> options,
ILoggerFactory logger,
UrlEncoder encoder)
: base(options, logger, encoder)
{
}
protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
{
// 1. Extract the MTLS_POP authorization header
var authHeader = Request.Headers.Authorization.FirstOrDefault();
if (string.IsNullOrEmpty(authHeader) ||
!authHeader.StartsWith($"{ProtocolScheme} ", StringComparison.OrdinalIgnoreCase))
{
return AuthenticateResult.NoResult();
}
var authToken = authHeader.Substring($"{ProtocolScheme} ".Length).Trim();
try
{
// 2. Parse the JWT token
var handler = new JsonWebTokenHandler();
var token = handler.ReadJsonWebToken(authToken);
// 3. Extract the 'cnf' claim
var cnfClaim = token.Claims.FirstOrDefault(c => c.Type == "cnf");
if (cnfClaim == null)
{
return AuthenticateResult.Fail("Missing 'cnf' claim in MTLS_POP token");
}
// 4. Extract certificate thumbprint from cnf claim
var cnfJson = JsonDocument.Parse(cnfClaim.Value);
if (!cnfJson.RootElement.TryGetProperty("x5t#S256", out var x5tS256Element))
{
return AuthenticateResult.Fail("Missing 'x5t#S256' in cnf claim");
}
var expectedThumbprint = x5tS256Element.GetString();
// 5. Get client certificate from TLS connection
var clientCert = Context.Connection.ClientCertificate;
if (clientCert != null)
{
var actualThumbprint = GetCertificateThumbprint(clientCert);
// 6. Validate certificate binding
if (!string.Equals(actualThumbprint, expectedThumbprint,
StringComparison.OrdinalIgnoreCase))
{
return AuthenticateResult.Fail(
"Certificate thumbprint mismatch with cnf claim");
}
}
// 7. Create claims principal
var claims = token.Claims.Select(c => new Claim(c.Type, c.Value)).ToList();
var identity = new ClaimsIdentity(claims, ProtocolScheme);
var principal = new ClaimsPrincipal(identity);
var ticket = new AuthenticationTicket(principal, ProtocolScheme);
return AuthenticateResult.Success(ticket);
}
catch (Exception ex)
{
Logger.LogError(ex, "Error validating mTLS PoP token");
return AuthenticateResult.Fail($"Validation error: {ex.Message}");
}
}
private static string GetCertificateThumbprint(X509Certificate2 certificate)
{
using var sha256 = SHA256.Create();
var hash = sha256.ComputeHash(certificate.RawData);
return Base64UrlEncoder.Encode(hash);
}
}
애플리케이션에서 토큰 바인딩 사용
다음 예제에서는 mTLS PoP 토큰 바인딩을 다른 애플리케이션 유형에 통합하는 방법을 보여 줍니다.
콘솔 또는 디먼 애플리케이션에서 API 호출
다음 예제에서는 mTLS PoP 토큰 바인딩을 사용하여 다운스트림 API를 호출하는 콘솔 또는 디먼 애플리케이션을 보여 줍니다.
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Identity.Abstractions;
using Microsoft.Identity.Web;
public class Program
{
public static async Task Main(string[] args)
{
// Create and configure token acquirer
var tokenAcquirerFactory = TokenAcquirerFactory.GetDefaultInstance();
tokenAcquirerFactory.Services.AddDownstreamApi(
"SecureApi",
tokenAcquirerFactory.Configuration.GetSection("SecureApi"));
var serviceProvider = tokenAcquirerFactory.Build();
// Get IDownstreamApi instance
var downstreamApi = serviceProvider.GetRequiredService<IDownstreamApi>();
// Call API with mTLS PoP token
var response = await downstreamApi.GetForAppAsync<ApiResponse>("SecureApi");
Console.WriteLine($"Result: {response?.Data}");
}
}
public class ApiResponse
{
public string? Data { get; set; }
}
ASP.NET Core 웹 애플리케이션에서 API 호출
다음 예제에서는 mTLS PoP 토큰 바인딩을 사용하여 다운스트림 API를 호출하는 컨트롤러를 보여줍니다.
using Microsoft.AspNetCore.Mvc;
using Microsoft.Identity.Abstractions;
[ApiController]
[Route("api/[controller]")]
public class DataController : ControllerBase
{
private readonly IDownstreamApi _downstreamApi;
private readonly ILogger<DataController> _logger;
public DataController(
IDownstreamApi downstreamApi,
ILogger<DataController> logger)
{
_downstreamApi = downstreamApi;
_logger = logger;
}
[HttpGet]
public async Task<IActionResult> GetSecureData()
{
try
{
// Call downstream API with mTLS PoP token binding
var data = await _downstreamApi.GetForAppAsync<SecureData>(
"SecureApi");
return Ok(data);
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to retrieve secure data");
return StatusCode(500, "Failed to retrieve data");
}
}
}
public class SecureData
{
public string? Id { get; set; }
public string? Value { get; set; }
}
프로그래밍 방식으로 DownstreamApiOptions 구성
다음 예제에서는 구성 파일 대신 코드에서 직접 mTLS PoP 옵션을 설정합니다.
using Microsoft.Identity.Abstractions;
using Microsoft.Identity.Web;
public class SecureApiService
{
private readonly IDownstreamApi _downstreamApi;
public SecureApiService(IDownstreamApi downstreamApi)
{
_downstreamApi = downstreamApi;
}
public async Task<T?> CallSecureApiAsync<T>(string endpoint) where T : class
{
return await _downstreamApi.GetForAppAsync<T>(
serviceName: null,
downstreamApiOptionsOverride: options =>
{
options.BaseUrl = "https://api.secure.com";
options.RelativePath = endpoint;
options.ProtocolScheme = "MTLS_POP";
options.RequestAppToken = true;
options.Scopes = new[] { "api://secure-api/.default" };
});
}
}
토큰 바인딩과 함께 MicrosoftIdentityMessageHandler 사용
MicrosoftIdentityMessageHandler는 AddMicrosoftIdentityMessageHandler 확장 메서드를 통해 mTLS PoP 토큰 바인딩을 지원합니다.
ProtocolScheme가 "MTLS_POP"로 설정되면, 처리기가 자동으로 바인딩된 토큰을 획득하고, mTLS로 구성된 HTTP 클라이언트를 통해 요청을 보냅니다.
인라인 옵션 구성
다음 예제에서는 인라인 mTLS PoP 구성을 사용하여 HTTP 클라이언트를 등록하고 서비스에서 해당 사용량을 보여 줍니다.
// Program.cs
services.AddHttpClient("MtlsPopClient", client =>
{
client.BaseAddress = new Uri("https://api.contoso.com");
})
.AddMicrosoftIdentityMessageHandler(options =>
{
options.Scopes.Add("api://contoso/.default");
options.ProtocolScheme = "MTLS_POP";
options.RequestAppToken = true;
});
// Usage in a service
public class SecureApiService
{
private readonly HttpClient _httpClient;
public SecureApiService(IHttpClientFactory factory)
{
_httpClient = factory.CreateClient("MtlsPopClient");
}
public async Task<string> GetSecureDataAsync()
{
// Authentication and mTLS certificate binding are automatic
var response = await _httpClient.GetAsync("/api/secure-data");
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
}
}
appsettings.json에서 구성 로드
구성 파일에서 토큰 바인딩 설정을 로드할 수도 있습니다.
appsettings.json:
{
"DownstreamApis": {
"SecureApi": {
"Scopes": ["api://secure-api/.default"],
"ProtocolScheme": "MTLS_POP",
"RequestAppToken": true
}
}
}
Program.cs: 다음 코드는 구성 섹션을 사용하여 HTTP 클라이언트를 등록합니다.
services.AddHttpClient("SecureApiClient", client =>
{
client.BaseAddress = new Uri("https://secure-api.example.com");
})
.AddMicrosoftIdentityMessageHandler(
configuration.GetSection("DownstreamApis:SecureApi"),
"SecureApi");
요청별 토큰 바인딩 적용
일부 요청에는 토큰 바인딩이 필요하고, 다른 요청에는 필요하지 않은 경우에는 요청별 옵션을 사용합니다.
services.AddHttpClient("FlexibleClient")
.AddMicrosoftIdentityMessageHandler();
// In a service:
public async Task<string> CallWithTokenBindingAsync()
{
var request = new HttpRequestMessage(HttpMethod.Get, "https://api.contoso.com/secure")
.WithAuthenticationOptions(options =>
{
options.Scopes.Add("api://contoso/.default");
options.ProtocolScheme = "MTLS_POP";
options.RequestAppToken = true;
});
var response = await _httpClient.SendAsync(request);
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
}
자세한 MicrosoftIdentityMessageHandler내용은 사용자 지정 API 설명서를 참조하세요.
권한 부여 헤더 공급자를 사용하여 사용자 지정 HttpClient 만들기
HTTP 요청을 보다 자세히 제어해야 하는 시나리오에는 이 방법을 사용합니다. 다음 예제에서는 바인딩된 권한 부여 헤더를 획득하고 mTLS로 구성된 HTTP 클라이언트를 만듭니다.
using Microsoft.Identity.Abstractions;
using System.Net.Http.Headers;
public class CustomApiClient
{
private readonly IAuthorizationHeaderProvider _authProvider;
private readonly IHttpClientFactory _httpClientFactory;
public CustomApiClient(
IAuthorizationHeaderProvider authProvider,
IHttpClientFactory httpClientFactory)
{
_authProvider = authProvider;
_httpClientFactory = httpClientFactory;
}
public async Task<string> CallApiWithCustomLogicAsync()
{
// Create downstream API options for mTLS PoP
var apiOptions = new DownstreamApiOptions
{
BaseUrl = "https://api.contoso.com",
ProtocolScheme = "MTLS_POP",
RequestAppToken = true,
Scopes = new[] { "api://contoso/.default" }
};
// Get authorization header with binding certificate info
var authResult = await (_authProvider as IBoundAuthorizationHeaderProvider)
?.CreateBoundAuthorizationHeaderAsync(apiOptions)!;
if (authResult.IsSuccess)
{
// Create HTTP client with certificate binding
var httpClient = authResult.Value.BindingCertificate != null
? CreateMtlsHttpClient(authResult.Value.BindingCertificate)
: _httpClientFactory.CreateClient();
// Set authorization header
httpClient.DefaultRequestHeaders.Authorization =
AuthenticationHeaderValue.Parse(authResult.Value.AuthorizationHeaderValue);
// Make API call
var response = await httpClient.GetAsync(
$"{apiOptions.BaseUrl}/api/endpoint");
return await response.Content.ReadAsStringAsync();
}
throw new InvalidOperationException("Failed to acquire token");
}
private HttpClient CreateMtlsHttpClient(X509Certificate2 certificate)
{
var handler = new HttpClientHandler();
handler.ClientCertificates.Add(certificate);
return new HttpClient(handler);
}
}
토큰 구조 검사
다음 예제에서는 표준 및 바인딩된 토큰의 차이점을 보여 줍니다.
표준 OAuth2 토큰 비교
표준 OAuth2 토큰에는 인증서 바인딩 정보가 없습니다.
{
"aud": "api://your-api",
"iss": "https://login.microsoftonline.com/tenant-id/",
"iat": 1234567890,
"exp": 1234571490,
"appid": "client-id",
"tid": "tenant-id"
}
바인딩을 사용하여 mTLS PoP 토큰 검토
mTLS PoP 토큰에는 토큰을 cnf 특정 인증서에 바인딩하는 클레임이 포함됩니다.
{
"aud": "api://your-api",
"iss": "https://login.microsoftonline.com/tenant-id/",
"iat": 1234567890,
"exp": 1234571490,
"appid": "client-id",
"tid": "tenant-id",
"cnf": {
"x5t#S256": "buc7x2HxS_hPnVJb9J5mwPr6jCw8Y_2LHDz-gp_-6KM"
}
}
(확인) 클레임에는 cnf Base64Url로 인코딩된 인증서의 SHA-256 지문이 포함됩니다.
현재 제한 사항 이해
mTLS PoP 토큰 바인딩을 구현하기 전에 다음 제약 조건을 검토합니다.
애플리케이션 토큰만 지원
토큰 바인딩은 현재 애플리케이션(앱 전용) 토큰만 지원합니다. 위임된(사용자) 토큰은 지원되지 않습니다.
프로토콜 구성표 설정
ProtocolScheme 토큰 바인딩을 사용하도록 설정하려면 "MTLS_POP" 속성을 명시적으로 설정해야 합니다. 설정하지 않으면 표준 전달자 인증이 사용됩니다.
인증서 요구 사항 충족
- 인증서를
ClientCredentials에 구성하고SendX5c를true로 설정해야 합니다. - 토큰 획득 시 인증서에 액세스할 수 있어야 합니다.
일반적인 문제 해결
다음 지침을 사용하여 토큰 바인딩 문제를 진단하고 해결합니다.
일반적인 문제 해결
1. "토큰에 'cnf' 클레임 누락"
원인: 토큰 바인딩이 제대로 구성되지 않았거나 토큰이 표준 전달자 토큰입니다.
해결 방법: ProtocolScheme이 "MTLS_POP"으로 설정되어 있는지 확인하고 RequestAppToken을(를) true으로 설정합니다.
{
"DownstreamApi": {
"ProtocolScheme": "MTLS_POP", // ensure this is set
"RequestAppToken": true
}
}
2. "인증서 지문 불일치"
원인: API에 제공된 인증서가 토큰 획득에 사용된 인증서와 일치하지 않습니다.
해결 방법:
- 토큰 획득 및 API 호출 모두에 동일한 인증서가 사용되는지 확인합니다.
-
ClientCredentials에서 인증서 로드 구성을 확인하십시오. - 인증서가 만료되거나 갱신되지 않았는지 확인
3. "토큰 바인딩에 필요한 인증서가 없습니다."
원인: Microsoft Entra 설정에 인증서가 구성되어 있지 않습니다.
해결 방법: 구성에 인증서를 ClientCredentials 추가하고 SendX5c를 true로 설정합니다.
{
"AzureAd": {
"ClientCredentials": [
{
"SourceType": "StoreWithDistinguishedName",
"CertificateStorePath": "CurrentUser/My",
"CertificateDistinguishedName": "CN=YourCertificate"
}
],
"SendX5c": true // required for token binding
}
}
4. "토큰 바인딩을 사용하려면 앱 토큰 획득이 필요합니다."
원인: RequestAppToken이(가) true로 설정되지 않았습니다.
해결 방법: 옵션에서 설정합니다 RequestAppTokentrue .
var options = new DownstreamApiOptions
{
ProtocolScheme = "MTLS_POP",
RequestAppToken = true, // must be true
};
디버그 토큰 바인딩
다음 기술을 사용하여 토큰 바인딩 문제를 조사합니다.
자세한 로깅 사용
Microsoft.Identity.Web의 디버그 수준 로깅을 활성화하려면 다음 구성을 추가하십시오.
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.Identity.Web": "Debug"
}
}
}
토큰 클레임 검사
다음 코드를 사용하여 토큰의 모든 클레임을 나열하고 cnf 클레임을 확인합니다.
var handler = new JsonWebTokenHandler();
var token = handler.ReadJsonWebToken(tokenString);
foreach (var claim in token.Claims)
{
Console.WriteLine($"{claim.Type}: {claim.Value}");
}
// Look for 'cnf' claim with x5t#S256
var cnfClaim = token.Claims.FirstOrDefault(c => c.Type == "cnf");
인증서 지문 확인
다음 코드를 사용하여 비교를 위해 인증서의 SHA-256 지문을 계산하고 표시합니다.
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using Microsoft.IdentityModel.Tokens;
var cert = new X509Certificate2("path/to/cert.pfx", "password");
using var sha256 = SHA256.Create();
var hash = sha256.ComputeHash(cert.RawData);
var thumbprint = Base64UrlEncoder.Encode(hash);
Console.WriteLine($"Certificate thumbprint: {thumbprint}");
보안 지침 준수
토큰 바인딩을 구현할 때 다음 보안 사례를 적용합니다.
인증서를 안전하게 관리
- 보안한 저장소: Azure Key Vault 또는 보안 인증서 저장소 사용
- 정기적으로 회전: 인증서 회전 프로시저 구현
- 만료 모니터링: 인증서 만료에 대한 경고 설정
- 액세스 제한: 인증서 프라이빗 키에 액세스할 수 있는 사용자 제한
네트워크 연결 보안
- TLS 1.2 이상 필요: 모든 연결에서 최신 TLS 버전을 사용하는지 확인
- 인증서 유효성 검사: 서버에서 적절한 인증서 유효성 검사 구현
- 강력한 암호 사용: 보안 암호 그룹 구성
토큰을 안전하게 처리
- 짧은 수명: 수명이 짧은 토큰 사용(권장: 1시간)
- 적절한 스토리지: 토큰을 기록하거나 노출하지 않습니다.
- 철저한 유효성 검사: 모든 클레임, 만료 및 바인딩 확인
모범 사례 준수
mTLS PoP 토큰 바인딩을 배포할 때는 다음 권장 사항을 염두에 두어야 합니다.
- 항상 HTTPS 사용: mTLS PoP를 사용하려면 보안 전송이 필요합니다.
- 하드웨어에 개인 키 자료를 저장하는 인증서 사용(예: TPM: 더 나은 보호를 위해 소프트웨어 보안에 하드웨어 사용)
- 적절한 오류 처리 구현: 인증서 및 토큰 오류를 정상적으로 처리
- 인증서 만료 모니터링: 인증서 갱신 자동화
- 환경별로 별도의 인증서 사용: 개발, 스테이징 및 프로덕션 인증서
- 로그 보안 이벤트: 토큰 바인딩 실패 및 인증서 불일치 추적
- 인증서 회전 테스트: 애플리케이션이 인증서 업데이트를 처리하는지 확인
- 구성 문서화: 인증서 요구 사항에 대한 명확한 설명서 유지
관련 콘텐츠
- Microsoft ID 웹 설명서
- 다운스트림 API 호출 개요
- 사용자 지정 API 설명서
- Microsoft Entra 인증서 자격 증명
- OAuth 2.0 Mutual-TLS 클라이언트 인증
샘플 코드 탐색
mTLS PoP 토큰 바인딩을 보여주는 전체 작업 샘플은 리포지토리에서 사용할 수 있습니다.
-
클라이언트 애플리케이션:
tests/DevApps/MtlsPop/MtlsPopClient -
Web API Server:
tests/DevApps/MtlsPop/MtlsPopWebApi
이러한 샘플은 다음을 보여 줍니다.
- 클라이언트 및 서버 구성 완료
- 인증서 바인딩을 사용하여 토큰 획득
- 사용자 지정 인증 처리기 구현
- 인증서 유효성 검사 및 지문 확인