Azure Service Bus에서 암호 없는 연결을 사용하도록 애플리케이션 마이그레이션
Azure Service Bus에 대한 애플리케이션 요청은 계정 액세스 키 또는 암호 없는 연결을 사용하여 인증되어야 합니다. 그러나 가능한 경우 애플리케이션에서 암호 없는 연결에 대한 우선 순위를 지정해야 합니다. 이 자습서에서는 기존 인증 방법에서 더 안전한 암호 없는 연결로 마이그레이션하는 방법에 대해 살펴봅니다.
액세스 키와 관련된 보안 위험
다음 코드 예제에서는 액세스 키를 포함하는 연결 문자열을 사용하여 Azure Service Bus에 연결하는 방법을 보여 줍니다. Service Bus를 만들 때 Azure는 이러한 키와 연결 문자열을 자동으로 생성합니다. 많은 개발자가 이전에 사용한 옵션에 익숙하다고 느끼므로 이 솔루션에 끌리고 있습니다. 현재 애플리케이션에서 연결 문자열을 사용하는 경우 이 문서에서 설명하는 단계를 사용하여 암호 없는 연결로 마이그레이션하는 것이 좋습니다.
연결 문자열은 주의해서 사용해야 합니다. 개발자는 키를 안전하지 않은 위치에 노출하지 않도록 끊임없이 노력해야 합니다. 키에 대한 액세스 권한을 얻은 사용자는 누구나 인증할 수 있습니다. 예를 들어 계정 키가 실수로 원본 제어에 체크 인되거나, 안전하지 않은 이메일을 통해 보내지거나, 잘못된 채팅에 붙여넣거나, 권한이 없는 사용자가 보는 경우 악의적인 사용자가 애플리케이션에 액세스할 위험이 있습니다. 대신 암호 없는 연결을 사용하도록 애플리케이션을 업데이트하는 것이 좋습니다.
암호 없는 연결로 마이그레이션
많은 Azure 서비스는 Microsoft Entra ID 및 RBAC(역할 기반 액세스 제어)를 통해 암호 없는 연결을 지원합니다. 이러한 기술은 강력한 보안 기능을 제공하며, Azure ID 클라이언트 라이브러리에서 DefaultAzureCredential
을 사용하여 구현할 수 있습니다.
Important
일부 언어는 코드에서 명시적으로 DefaultAzureCredential
을 구현해야 하지만, 다른 언어는 기본 플러그 인 또는 드라이버를 통해 내부적으로 DefaultAzureCredential
을 활용합니다.
DefaultAzureCredential
은 여러 인증 방법을 지원하고 런타임에 사용해야 하는 방법을 자동으로 결정합니다. 이 방법을 사용하면 앱에서 환경별 코드를 구현하지 않고도 다양한 환경(로컬 개발 및 프로덕션)에서 다양한 인증 방법을 사용할 수 있습니다.
DefaultAzureCredential
에서 자격 증명을 검색하는 순서와 위치는 Azure Identity 라이브러리 개요에서 확인할 수 있으며 언어마다 다릅니다. 예를 들어 .NET에서 로컬로 사용하는 경우 일반적으로 DefaultAzureCredential
에서 개발자가 Visual Studio, Azure CLI 또는 Azure PowerShell에 로그인하는 데 사용한 계정을 사용하여 인증합니다. 앱이 Azure에 배포되면 DefaultAzureCredential
에서 자동으로 Azure App Service와 같은 연결된 호스팅 서비스의 관리 ID를 검색하고 사용합니다. 이 전환에서는 코드를 변경할 필요가 없습니다.
참고 항목
관리 ID는 앱 또는 서비스를 나타내는 보안 ID를 제공합니다. ID는 Azure 플랫폼에서 관리하며 비밀을 프로비전하거나 회전할 필요가 없습니다. 관리 ID는 개요 설명서에서 자세히 알아볼 수 있습니다.
다음 코드 예제에서는 암호 없는 연결을 사용하여 Service Bus에 연결하는 방법을 보여줍니다. 다음 섹션에서는 이 설정으로 마이그레이션하는 방법에 대해 자세히 설명합니다.
.NET 애플리케이션은 DefaultAzureCredential
의 인스턴스를 서비스 클라이언트 클래스의 생성자에 전달할 수 있습니다. DefaultAzureCredential
은 해당 환경에서 사용 가능한 자격 증명을 자동으로 검색합니다.
client = new ServiceBusClient(
"<NAMESPACE-NAME>.servicebus.windows.net",
new DefaultAzureCredential());
암호 없는 인증을 사용하도록 앱을 마이그레이션하는 단계
다음 단계에서는 키 기반 솔루션 대신 암호 없는 연결을 사용하도록 기존 애플리케이션을 마이그레이션하는 방법에 대해 설명합니다. 먼저 로컬 개발 환경을 구성한 다음, 해당 개념을 Azure 앱 호스팅 환경에 적용합니다. 액세스 키를 직접 사용하는지 아니면 연결 문자열을 통해 사용하는지 여부에 관계없이 이러한 동일한 마이그레이션 단계를 적용해야 합니다.
로컬 개발 인증에 대한 역할 및 사용자 구성
로컬로 개발하는 경우 Service Bus 데이터에 액세스하는 사용자 계정에 올바른 권한이 있는지 확인합니다. 이 예제에서는 Azure Service Bus 데이터 소유자 역할을 사용하여 데이터를 보내고 받지만 보다 세분화된 역할도 사용할 수 있습니다. 이 역할을 자신에게 할당하려면 사용자 액세스 관리자 역할 또는 Microsoft.Authorization/roleAssignments/write 작업을 포함하는 다른 역할이 필요합니다. Azure Portal, Azure CLI 또는 Azure PowerShell을 사용하여 사용자에게 Azure RBAC 역할을 할당할 수 있습니다. 범위 개요 페이지에서 역할 할당에 사용할 수 있는 범위에 대해 자세히 알아볼 수 있습니다.
이 시나리오에서는 최소 권한 원칙을 따르기 위해 범위가 특정 Service Bus 네임스페이스로 지정된 사용자 계정에 권한을 할당합니다. 이 방법은 사용자에게 필요한 최소 권한만 부여하고 더 안전한 프로덕션 환경을 만듭니다.
다음 예제에서는 Azure Service Bus 데이터 소유자 역할을 사용자 계정에 할당함으로써 데이터를 보내고 받을 수 있습니다.
Important
대부분의 경우 Azure에서 역할 할당이 전파되는 데 1~2분이 걸리지만 드문 경우이지만 최대 8분이 걸릴 수 있습니다. 코드를 처음 실행할 때 인증 오류가 발생하면 잠시 기다렸다가 다시 시도하세요.
Azure Portal에서 기본 검색 표시줄 또는 왼쪽 탐색을 사용하여 Service Bus 네임스페이스를 찾습니다.
Service Bus 개요 페이지의 왼쪽 메뉴에서 액세스 제어(IAM)를 선택합니다.
액세스 제어(IAM) 페이지에서 역할 할당 탭을 선택합니다.
위쪽 메뉴에서 + 추가를 선택한 다음, 드롭다운 메뉴에서 역할 할당 추가를 선택합니다.
검색 상자를 사용하여 결과를 원하는 역할로 필터링합니다. 이 예제에서는 Azure Service Bus 데이터 소유자를 검색하고 일치하는 결과를 선택한 후, 다음을 선택합니다.
다음에 대한 액세스 할당 아래에서 사용자, 그룹 또는 서비스 주체를 선택한 다음, + 멤버 선택을 선택합니다.
대화 상자에서 Microsoft Entra 사용자 이름(일반적으로 user@domain 이메일 주소)을 검색한 다음, 대화 상자 하단에서 선택을 선택합니다.
검토 + 할당을 선택하여 최종 페이지로 이동한 다음, 검토 + 할당을 다시 선택하여 프로세스를 완료합니다.
로그인 및 암호 없는 연결을 사용하도록 앱 코드 마이그레이션
로컬 개발의 경우 Service Bus 네임스페이스에 대해 역할을 할당한 것과 동일한 Microsoft Entra 계정으로 인증되었는지 확인합니다. Azure CLI, Visual Studio, Azure PowerShell 또는 기타 도구(예: IntelliJ)를 통해 인증할 수 있습니다.
로컬 개발의 경우 역할을 할당한 것과 동일한 Microsoft Entra 계정을 사용하여 인증되었는지 확인합니다. Azure CLI 또는 Azure PowerShell과 같은 인기 있는 개발 도구를 통해 인증할 수 있습니다. 인증할 수 있는 개발 도구는 언어에 따라 다릅니다.
다음 명령을 사용하여 Azure CLI를 통해 Azure에 로그인합니다.
az login
다음으로, 암호 없는 연결을 사용하도록 코드를 업데이트합니다.
.NET 애플리케이션에서
DefaultAzureCredential
을 사용하려면Azure.Identity
패키지를 설치합니다.dotnet add package Azure.Identity
파일 맨 위에 다음 코드를 추가합니다.
using Azure.Identity;
Azure Service Bus에 연결할
ServiceBusClient
개체를 만드는 코드를 식별합니다. 코드를 다음 예제와 일치하도록 업데이트합니다.var serviceBusNamespace = $"{namespace}.servicebus.windows.net"; ServiceBusClient client = new( serviceBusNamespace, new DefaultAzureCredential());
로컬에서 앱 실행하기
이러한 코드가 변경되면 애플리케이션을 로컬로 실행합니다. 새 구성에서 Azure CLI, Visual Studio 또는 IntelliJ와 같은 로컬 자격 증명을 선택해야 합니다. Azure에서 로컬 개발자 사용자에게 할당한 역할을 통해 앱에서 Azure 서비스에 로컬로 연결할 수 있습니다.
Azure 호스팅 환경 구성
애플리케이션이 암호 없는 연결을 사용하도록 구성되고 로컬로 실행되면 동일한 코드가 Azure에 배포된 후 Azure 서비스에 인증될 수 있습니다. 예를 들어 관리 ID가 사용하도록 설정된 Azure App Service 인스턴스에 배포된 애플리케이션에서 Azure Service Bus에 연결할 수 있습니다.
Azure Portal을 사용하여 관리 ID 만들기
다음 단계에서는 다양한 웹 호스팅 서비스에 대해 시스템이 할당한 관리 ID를 만드는 방법을 보여 줍니다. 관리 ID는 이전에 설정한 앱 구성을 사용하여 다른 Azure 서비스에 안전하게 연결할 수 있습니다.
일부 앱 호스팅 환경은 Azure 컴퓨팅 서비스를 다른 지원 서비스에 연결하는 데 도움이 되는 서비스 커넥터를 지원합니다. 서비스 커넥터는 네트워크 설정 및 연결 정보를 자동으로 구성합니다. 서비스 커넥터 및 지원되는 시나리오는 개요 페이지에서 자세히 알아볼 수 있습니다.
현재 지원되는 컴퓨팅 서비스는 다음과 같습니다.
- Azure App Service
- Azure Spring Cloud
- Azure Container Apps(미리 보기)
이 마이그레이션 가이드의 경우 App Service를 사용하지만, 이 단계는 Azure Spring Apps 및 Azure Container Apps와 비슷합니다.
참고 항목
Azure Spring Apps는 현재 연결 문자열을 사용하는 서비스 커넥터만 지원합니다.
App Service에 대한 기본 개요 페이지의 왼쪽 탐색 영역에서 서비스 커넥터를 선택합니다.
위쪽 메뉴에서 + 만들기를 선택합니다. 그러면 연결 만들기 패널이 열립니다. 다음 값을 입력합니다.
- 서비스 유형: Service Bus를 선택합니다.
- 구독: 사용하려는 구독을 선택합니다.
- 연결 이름: 연결 이름을 입력합니다(예: connector_appservice_servicebus).
- 클라이언트 유형: 기본값을 선택된 상태로 두거나 사용하려는 특정 클라이언트를 선택합니다.
다음: 인증을 선택합니다.
시스템이 할당한 관리 ID(권장)가 선택되어 있는지 확인하고, 다음: 네트워킹을 선택합니다.
기본값을 선택된 상태로 두고, 다음: 검토 + 만들기를 선택합니다.
Azure에서 설정의 유효성을 검사한 후 만들기를 선택합니다.
서비스 커넥터에서 App Service에 대해 시스템이 할당한 관리 ID를 자동으로 만듭니다. 또한 커넥터는 선택한 Service Bus에 대한 관리 ID에 Azure Service Bus 데이터 소유자 역할을 할당합니다.
또한 Azure CLI를 사용하여 Azure 호스팅 환경에서 관리 ID를 사용하도록 설정할 수도 있습니다.
- 서비스 커넥터
- Azure App Service
- Azure Spring Apps
- Azure Container Apps
- Azure Virtual Machines
- Azure Kubernetes Service
서비스 커넥터를 통해 Azure CLI를 사용하여 Azure 컴퓨팅 호스팅 환경과 대상 서비스 간의 연결을 만들 수 있습니다. CLI는 포털 지침에서 설명한 대로 자동으로 관리 ID 만들기를 처리하고 적절한 역할을 할당합니다.
Azure App Service를 사용하는 경우 az webapp connection
명령을 사용합니다.
az webapp connection create servicebus \
--resource-group <resource-group-name> \
--name <webapp-name> \
--target-resource-group <target-resource-group-name> \
--namespace <target-service-bus-namespace> \
--system-identity
Azure Spring Apps를 사용하는 경우 az spring connection
명령을 사용합니다.
az spring connection create servicebus \
--resource-group <resource-group-name> \
--service <service-instance-name> \
--app <app-name> \
--deployment <deployment-name> \
--target-resource-group <target-resource-group> \
--namespace <target-service-bus-namespace> \
--system-identity
Azure Container Apps를 사용하는 경우 az containerapp connection
명령을 사용합니다.
az containerapp connection create servicebus \
--resource-group <resource-group-name> \
--name <webapp-name> \
--target-resource-group <target-resource-group-name> \
--namespace <target-service-bus-namespace> \
--system-identity
관리 ID에 역할 할당
다음으로, Service Bus에 액세스하기 위해 만든 관리 ID에 권한을 부여해야 합니다. 이 작업은 로컬 개발 사용자에게 수행한 것처럼 역할을 관리 ID에 할당하여 수행할 수 있습니다.
서비스 커넥터를 사용하여 서비스를 연결한 경우 이 단계를 완료할 필요가 없습니다. 필요한 구성이 처리되었습니다.
연결을 만드는 동안 관리 ID를 선택한 경우 앱에 대해 시스템이 할당한 관리 ID가 만들어지고 Service Bus에서 Azure Service Bus 데이터 소유자 역할이 할당됩니다.
연결 문자열을 선택한 경우 연결 문자열이 앱 환경 변수로 추가되었습니다.
앱 테스트
이러한 코드가 변경되면 브라우저에서 호스트된 애플리케이션으로 이동합니다. 앱에서 Service Bus에 성공적으로 연결할 수 있어야 합니다. 역할 할당이 Azure 환경을 통해 전파되는 데 몇 분 정도 걸릴 수 있습니다. 이제 개발자가 애플리케이션 자체에서 비밀을 관리하지 않고도 애플리케이션이 로컬 및 프로덕션 환경 모두에서 실행되도록 구성되었습니다.
다음 단계
이 자습서에서는 애플리케이션을 암호 없는 연결로 마이그레이션하는 방법을 알아보았습니다.