이 가이드는 애플리케이션에서 인증을 처리하기 위해 에이전트 ID용 Microsoft Entra SDK와 in-process Microsoft.Identity.Web 라이브러리 간의 차이점을 식별하는 데 도움을 줍니다. Microsoft. Identity.Web 라이브러리는 성능을 최대화하기 위해 .NET 애플리케이션에 직접 통합됩니다. 에이전트 ID용 Microsoft Entra SDK는 별도의 컨테이너로 실행되며 HTTP API를 통해 프로그래밍 언어를 지원합니다. 올바른 방법을 선택하는 방법은 애플리케이션의 아키텍처, 언어 및 배포 환경에 따라 달라집니다.
아키텍처 차이점
기본적인 차이점은 인증 논리가 실행되는 위치에 있습니다. Microsoft. Identity.Web은 애플리케이션 프로세스 내에서 실행됩니다. 에이전트 ID용 Microsoft Entra SDK는 애플리케이션과 함께 독립적인 서비스로 작동합니다. 이 아키텍처 선택은 개발 워크플로 및 운영 복잡성과 같은 요인에 영향을 줍니다.
| 측면 | Microsoft.Identity.Web (In-Process) | 에이전트 ID용 SDK Microsoft Entra(Out-of-Process) |
|---|---|---|
| 프로세스 경계 | 애플리케이션과 동일한 프로세스, 메모리 및 수명 주기를 공유하여 직접 메서드 호출 및 공유 구성을 사용하도록 설정 | HTTP API를 통해서만 통신하고 자체 리소스를 독립적으로 관리하여 완전한 격리를 유지합니다. |
| 언어 결합 | 인증 전략을 .NET 긴밀하게 결합하여 인증이 필요한 모든 곳에서 C# 환경 및 .NET 런타임이 필요합니다. | 애플리케이션의 기술 스택에서 인증을 분리하여 Python, Node.js, Go 또는 HTTP 지원 언어와 동일하게 잘 작동하는 언어에 구애받지 않는 HTTP 인터페이스를 노출합니다. |
| 배포 모델 | 애플리케이션 이진 파일에 포함된 NuGet 패키지로 배포하여 모놀리식 배포 단위 만들기 | 별도의 컨테이너 이미지로 배포하여 애플리케이션 코드에 영향을 주지 않고 인증 논리의 독립적인 버전 관리, 크기 조정 및 업데이트를 사용하도록 설정합니다. |
Microsoft.Identity.Web(인프로세스)
이 코드 스니펫은 Microsoft.Identity.Web이 ASP.NET Core 애플리케이션에 어떻게 직접 통합되는지를 보여줍니다.
// Startup configuration
services.AddMicrosoftIdentityWebApiAuthentication(Configuration)
.EnableTokenAcquisitionToCallDownstreamApi()
.AddDownstreamApi("Graph", Configuration.GetSection("DownstreamApis:Graph"))
.AddInMemoryTokenCaches();
// Usage in controller
public class MyController : ControllerBase
{
private readonly IDownstreamApi _downstreamApi;
public MyController(IDownstreamApi downstreamApi)
{
_downstreamApi = downstreamApi;
}
public async Task<ActionResult> GetUserData()
{
var user = await _downstreamApi.GetForUserAsync<User>("Graph",
options => options.RelativePath = "me");
return Ok(user);
}
}
에이전트 ID용 Microsoft Entra SDK (Out-of-Process)
이 코드 조각은 HTTP를 사용하여 Node.js 애플리케이션에서 에이전트 ID에 대한 Microsoft Entra SDK를 호출하는 방법을 보여 줍니다. SDK의 /DownstreamApi 엔드포인트에 대한 호출은 토큰 획득 및 다운스트림 API 호출을 처리하며, Authorization 헤더에서 OBO 흐름에 대한 들어오는 토큰의 전달을 포함합니다.
// Configuration
const SidecarUrl = process.env.SIDECAR_URL || "http://localhost:5000";
// Usage in application
async function getUserData(incomingToken: string) {
const response = await fetch(
`${SidecarUrl}/DownstreamApi/Graph?optionsOverride.RelativePath=me`,
{
headers: {
'Authorization': `Bearer ${incomingToken}`
}
}
);
const result = await response.json();
return JSON.parse(result.content);
}
기능 비교
| 특징 | Microsoft. Identity.Web | Microsoft Entra 에이전트 ID용 SDK |
|---|---|---|
| 언어 지원 | C# / .NET 전용 | 모든 언어(HTTP) |
| Deployment | 인프로세스 라이브러리 | 별도의 컨테이너 |
| 토큰 획득 | 직접 MSAL.NET | HTTP API를 통해 |
| 토큰 캐싱 | 메모리 내 분산 | 메모리 내 분산 |
| OBO 흐름 | 기본 지원 | HTTP 엔드포인트를 통해 |
| 클라이언트 자격 증명 | 기본 지원 | HTTP 엔드포인트를 통해 |
| 관리되는 ID | 직접 지원 | 직접 지원 |
| 에이전트 ID | 확장을 통해 | 쿼리 매개 변수 |
| 토큰 유효성 검사 | Middleware | /엔드포인트 유효성 검사 |
| 다운스트림 API | IDownstreamApi | /DownstreamApi 엔드포인트 |
| Microsoft Graph | Graph SDK 통합 | DownstreamApi를 통해 |
| 성능 | 진행 중 (가장 빠른) | HTTP 오버헤드 |
| Configuration |
appsettings.json 및 코드 |
appsettings.json 및 환경 변수 |
| 디버깅 | 표준 .NET 디버깅 | 컨테이너 디버깅 |
| 핫 다시 로드 | .NET 핫 리로드 (실시간 코드 업데이트 기능) | 컨테이너 다시 시작 |
| 패키지 업데이트 | NuGet 패키지 | 컨테이너 이미지 |
| 라이선스 | MIT | MIT |
각 방법을 사용하는 경우
Microsoft.Identity.Web과 에이전트 ID용 Microsoft Entra SDK 중 어떤 것을 사용할지는 애플리케이션의 요구 사항, 아키텍처 및 배포 전략에 따라 결정됩니다. 요구 사항에 따라 한 가지 방법이 다른 방법보다 더 적합할 수 있습니다. 다음 지침은 정보에 입각한 결정을 내리는 데 도움이 될 수 있습니다.
| Scenario | Microsoft.Identity.Web (In-Process) | Microsoft Entra 에이전트 ID용 SDK (Out-of-Process) |
|---|---|---|
| 애플리케이션 스택 | .NET 애플리케이션 전용 • ASP.NET Core Web API • ASP.NET Core Web Apps • .NET Worker Services • Blazor 애플리케이션 • 디먼 앱 |
다중 언어 마이크로 서비스 • Node.js, Python, Go, Java 서비스 • 다중 언어 아키텍처 • 비 .NET 서비스 • 레거시 시스템 통합 |
| 성능 요구 사항 | 성능이 중요합니다. • 높은 처리량 시나리오 • 대기 시간에 민감한 작업 • 1밀리초마다 |
HTTP 오버헤드를 허용할 수 있습니다. • 최대 1~5ms의 추가 대기 시간이 허용됩니다. • 인증에 의해 처리량이 병목 현상이 되지 않음 |
| 통합 요구 사항 | 심층 통합 필요 • 사용자 지정 MSAL.NET 구성 • MSAL 기능에 직접 액세스 • 고급 토큰 캐시 전략 |
표준화된 통합 • HTTP API 충분 • 서비스 전반에서 일관된 인증 패턴 |
| 개발 환경 | 신속한 개발 • 빠른 프로토타입 생성 • 개발을 위한 실시간 재로드 • 표준 .NET 디버깅 |
컨테이너 기반 개발 변경에 따른 컨테이너를 다시 시작 • 컨테이너 디버깅 필요 |
| 팀 아키텍처 | 단일 언어 스택 • C#/.NET 팀의 전문 지식 • 다 언어 요구 사항 없음 |
기술 다양성 • 프레임워크와 언어의 혼합 • Polyglot 팀 구조 |
| 배포 모델 | 모놀리식 배포 • 단일 애플리케이션 배포 • 기존 호스팅 모델 |
컨테이너화된 배포 • Kubernetes 환경 • Docker Compose 설정 • 서비스 메시 아키텍처 |
| Operations | 결합된 인증 업데이트 • 인증 변경에 앱 다시 빌드 필요 • 애플리케이션과 공유 수명 주기 |
운영상의 이점 • 인증 논리의 독립적인 크기 조정 • 앱 코드에서 인증 업데이트 분리 • 인증의 중앙 집중식 모니터링 |
마이그레이션 지침
Microsoft.Identity.Web에서 AgentID용 Microsoft Entra SDK로 마이그레이션
특정 시나리오에서는 Microsoft.Identity.Web을 사용하는 기존 .NET 애플리케이션을 마이그레이션하여 인증을 위해 에이전트 ID용 Microsoft Entra SDK를 활용할 수 있습니다. 마이그레이션의 원인으로는 다국어 아키텍처 채택, 서비스 간 인증 표준화 또는 컨테이너화된 배포 모델로의 이동 등이 있습니다.
이 변경을 수행하기 전에 신중한 고려와 계획이 필요합니다. 이 섹션에서는 애플리케이션을 전환하는 데 도움이 되는 코드 예제와 함께 개략적인 마이그레이션 경로를 제공합니다.
주의
Microsoft는 Microsoft.Identity.Web에서 AgentID용 Microsoft Entra SDK로 이동하지 않는 것을 권장합니다. 이 변경을 선택하는 경우 다음 예제에서는 다른 언어 및 프레임워크에서 유사한 개념을 보여 줍니다.
1단계: SDK 컨테이너 배포
먼저 Pod에 SDK 컨테이너를 추가합니다.
# Before: Single ASP.NET Core container
containers:
- name: app
image: myregistry/myapp:latest
# After: App + Microsoft Entra SDK for AgentID
containers:
- name: app
image: myregistry/myapp:latest
env:
- name: SIDECAR_URL
value: "http://localhost:5000"
- name: sidecar
image: mcr.microsoft.com/entra-sdk/auth-sidecar:1.0.0
env:
- name: AzureAd__TenantId
value: "your-tenant-id"
- name: AzureAd__ClientId
value: "your-client-id"
2단계: 구성 마이그레이션
다음으로, appsettings.json에서 환경 변수로 구성을 전송합니다.
Before(appsettings.json)
{
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"TenantId": "your-tenant-id",
"ClientId": "your-client-id"
},
"DownstreamApis": {
"Graph": {
"BaseUrl": "https://graph.microsoft.com/v1.0",
"Scopes": "User.Read Mail.Read",
"RelativePath": "/me"
}
}
}
After(Kubernetes ConfigMap / 환경 변수)
apiVersion: v1
kind: ConfigMap
metadata:
name: sidecar-config
data:
AzureAd__Instance: "https://login.microsoftonline.com/"
AzureAd__TenantId: "your-tenant-id"
AzureAd__ClientId: "your-client-id"
DownstreamApis__Graph__BaseUrl: "https://graph.microsoft.com/v1.0"
DownstreamApis__Graph__Scopes: "User.Read Mail.Read"
DownstreamApis__Graph__RelativePath: "/me"
3단계: 애플리케이션 코드 업데이트
Microsoft.Identity.Web에 대한 모든 in-process 호출 인스턴스를 찾아 Microsoft Entra SDK의 에이전트 ID 엔드포인트에 대한 HTTP 호출로 교체하십시오.
이전(IDownstreamApi를 사용하여 C#):
public class UserController : ControllerBase
{
private readonly IDownstreamApi _downstreamApi;
public UserController(IDownstreamApi downstreamApi)
{
_downstreamApi = downstreamApi;
}
[HttpGet]
public async Task<ActionResult<User>> GetMe()
{
var user = await _downstreamApi.GetForUserAsync<User>(
"Graph",
options => options.RelativePath = "me"
);
return Ok(user);
}
}
이후(HTTP 클라이언트가 있는 모든 언어)
다음 코드 조각에서 /DownstreamApi 엔드포인트를 사용하여 사용자 데이터를 가져오기 위한 에이전트 ID에 대한 Microsoft Entra SDK 호출이 표시됩니다. 예제는 C# 및 TypeScript에서 제공됩니다.
public class UserController : ControllerBase
{
private readonly HttpClient _httpClient;
private readonly string _SidecarUrl;
public UserController(IHttpClientFactory httpClientFactory, IConfiguration config)
{
_httpClient = httpClientFactory.CreateClient();
_SidecarUrl = config["SIDECAR_URL"];
}
[HttpGet]
public async Task<ActionResult<User>> GetMe()
{
var inboundAuthorizationHeader = Request.Headers["Authorization"].ToString();
// this validates the inbound authorization header and calls the downstream API.
// If you don't call a downstream API, Do validate the inbound authorization header
// (calling the /Validate endpoint)
var request = new HttpRequestMessage(
HttpMethod.Get,
$"{_SidecarUrl}/DownstreamApi/Graph?optionsOverride.RelativePath=me"
);
request.Headers.Add("Authorization", inboundAuthorizationHeader);
var response = await _httpClient.SendAsync(request);
var result = await response.Content.ReadFromJsonAsync<SidecarResponse>();
var user = JsonSerializer.Deserialize<User>(result.Content);
return Ok(user);
}
}
TypeScript
다음과 같이 TypeScript에서 동일한 논리를 구현할 수 있습니다.
export async function getMe(incomingToken: string): Promise<User> {
const SidecarUrl = process.env.SIDECAR_URL!;
const response = await fetch(
`${SidecarUrl}/DownstreamApi/Graph?optionsOverride.RelativePath=me`,
{
headers: {
'Authorization': incomingToken
}
}
);
const result = await response.json();
return JSON.parse(result.content) as User;
}
4단계: Microsoft.Identity.Web 종속성 제거
이전 단계를 완료한 후 프로젝트에서 Microsoft.Identity.Web에 대한 NuGet 패키지를 제거하여 애플리케이션을 정리하십시오.
<!-- Remove these from .csproj -->
<PackageReference Include="Microsoft.Identity.Web" Version="..." />
<PackageReference Include="Microsoft.Identity.Web.MicrosoftGraph" Version="..." />
<PackageReference Include="Microsoft.Identity.Web.DownstreamApi" Version="..." />
앱에서 토큰의 유효성을 검사하려는 경우에도 원래 인증 구성을 제거할 필요가 없습니다. 대신 유효성 검사를 AgentID용 Microsoft Entra SDK에 전적으로 위임할 수 있습니다.
// Remove from Program.cs or Startup.cs
services.AddMicrosoftIdentityWebApiAuthentication(Configuration)
.EnableTokenAcquisitionToCallDownstreamApi()
.AddDownstreamApi("Graph", Configuration.GetSection("DownstreamApis:Graph"))
.AddInMemoryTokenCaches();
5단계: 테스트 및 유효성 검사
- 단위 테스트: SDK에 대한 모의 HTTP 호출로 테스트를 업데이트합니다.
- 통합 테스트: 스테이징에서 SDK 통신을 테스트합니다.
- 성능 테스트: HTTP 오버헤드 영향을 측정합니다.
- 보안 테스트: 토큰 처리 및 네트워크 정책의 유효성을 검사합니다.
성능 고려 사항
SDK 오버헤드
에이전트 ID용 Microsoft Entra SDK는 HTTP 통신 오버헤드를 발생합니다.
| 성능 요소 | Impact | 완화 전략 |
|---|---|---|
| Latency | localhost 통신 요청당 약 1-5ms | HTTP/2를 사용하여 연결 오버헤드를 줄입니다. |
| Throughput | HTTP 연결 풀링에 의해 제한됨 | HTTP 연결을 다시 사용하도록 연결 풀링을 구현합니다. |
| 기억 | 추가 컨테이너 메모리 오버헤드 | 적절한 SDK 리소스 할당을 확인합니다. |
| 요청 효율성 | 복잡한 작업을 위한 여러 번의 왕복 처리 | 가능하면 여러 작업을 결합하기 위한 일괄 처리 요청입니다. |
| 토큰 성능 | 반복된 토큰 획득 오버헤드 | 최적의 성능을 위해 SDK의 토큰 캐시를 활용합니다. |
프로세스 중 성능
Microsoft.Identity.Web은 귀하의 애플리케이션과 동일한 프로세스 내에서 실행되므로 최소화된 오버헤드를 가집니다. HTTP 제한 없이 네이티브 메서드 호출에 마이크로초 대기 시간 및 공유 프로세스 메모리를 제공합니다. 성능이 중요한 경우 프로세스 내 통합이 최적의 선택입니다. 그러나 AgentID의 유연성 및 언어 불가지론적 디자인에 대한 Microsoft Entra SDK는 많은 시나리오에서 성능 장단점보다 클 수 있습니다.
다음 표에서는 인프로세스 사용량 및 Microsoft Entra SDK를 사용하는 에이전트 ID(아웃오브프로세스) 사용에 대한 몇 가지 성능 및 비용을 비교합니다.
비용 고려 사항
| 비용 요소 | Microsoft.Identity.Web (In-Process) | 에이전트 ID용 Microsoft Entra SDK(Out-of-Process) |
|---|---|---|
| 컴퓨팅 | 애플리케이션 프로세스에서 최소 추가 CPU 및 메모리 | Pod당 추가 컨테이너 리소스. |
| Network | 추가 오버헤드 없음 | 최소한의 localhost 통신. |
| 스토리지 | NuGet 패키지 크기(~10MB) | 컨테이너 이미지 스토리지. |
| 관리 | 추가 오버헤드 없음 | 컨테이너 오케스트레이션 오버헤드. |
비용 예제
128MiB/100m SDK 구성을 사용하는 10개의 복제본의 경우:
| Resource | 처리 중 | Microsoft Entra 에이전트 ID용 SDK |
|---|---|---|
| 기억 | ~0MB 추가 | 10× 128MiB = 1.28GB |
| 중앙 처리 장치(CPU) | ~0% 추가 | 10 × 100m = 1 코어 |
| 스토리지 | 배포당 최대 10MB | 노드당 컨테이너 이미지 크기 |
지원 및 유지 관리
| 측면 | Microsoft. Identity.Web | Microsoft Entra 에이전트 ID용 SDK |
|---|---|---|
| Updates | NuGet 패키지 업데이트 | 컨테이너 이미지 업데이트 |
| 주요 변경 내용 | 패키지 버전 관리를 통해 | 컨테이너 태그를 통해 |
| 버그 수정 | 컴파일 시간 통합 | 런타임 컨테이너 업데이트 |
| 보안 패치 | 애플리케이션 다시 빌드 | 컨테이너 다시 배포 |
| Documentation | 광범위한 .NET 문서 | 이 설명서 |
| Community | 대규모 .NET 커뮤니티 | 성장하는 커뮤니티 |
하이브리드 접근 방식
동일한 아키텍처 내에서 두 방법을 결합할 수 있습니다. Microsoft.Identity.Web을 최대 성능이 필요한 .NET 서비스에 사용하고, 비 .NET 서비스이거나 언어에 구애받지 않는 인증 패턴이 필요한 경우 Microsoft Entra SDK를 에이전트 ID에 사용합니다. 이 하이브리드 전략은 전체 서비스 에코시스템에서 일관성과 유연성을 유지하면서 중요한 성능을 최적화하는 데 도움이 됩니다.
예제 아키텍처는 다음과 같습니다.
graph TB
subgraph cluster["Kubernetes Cluster"]
subgraph netpod["<b>.NET API Pod</b>"]
netapi["<b>.NET API</b><br/>(Microsoft.Identity.Web)"]
style netapi fill:#0078d4,stroke:#005a9e,stroke-width:2px,color:#fff
end
subgraph nodepod["<b>Node.js API Pod</b>"]
nodeapi["<b>Node.js API</b>"]
sidecar["<b>Microsoft Entra SDK for AgentID</b>"]
style nodeapi fill:#68a063,stroke:#4a7c45,stroke-width:2px,color:#fff
style sidecar fill:#f2711c,stroke:#d85e10,stroke-width:2px,color:#fff
end
end
style cluster fill:#f0f0f0,stroke:#333,stroke-width:3px
style netpod fill:#e8f4f8,stroke:#0078d4,stroke-width:2px
style nodepod fill:#e8f4e8,stroke:#68a063,stroke-width:2px