.NET을 사용하여 Blob에 대한 서비스 SAS 만들기

SAS(공유 액세스 서명)를 사용하면 스토리지 계정의 컨테이너 및 Blob에 대한 제한된 액세스 권한을 부여할 수 있습니다. SAS를 만들 때 클라이언트에서 액세스할 수 있는 Azure Storage 리소스, 해당 리소스에 대한 사용 권한, SAS의 유효 기간 등의 해당 제약 조건을 지정합니다.

모든 SAS는 키로 서명됩니다. 다음 두 가지 방법 중 하나로 SAS에 서명할 수 있습니다.

  • Microsoft Entra 자격 증명을 사용하여 만들어진 키를 사용합니다. Microsoft Entra 자격 증명으로 서명된 SAS는 사용자 위임 SAS입니다. 사용자 위임 SAS를 만드는 클라이언트에는 Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey 작업을 포함하는 Azure RBAC 역할이 할당되어야 합니다. 자세한 내용은 사용자 위임 SAS 만들기를 참조하세요.
  • 스토리지 계정 키를 사용합니다. 서비스 SAS계정 SAS는 모두 스토리지 계정 키로 서명됩니다. 서비스 SAS를 만드는 클라이언트는 계정 키에 대한 직접 액세스 권한이 있거나 Microsoft.Storage/storageAccounts/listkeys/action 권한이 할당되어야 합니다. 자세한 내용은 서비스 SAS 만들기 또는 계정 SAS 만들기를 참조하세요.

참고 항목

사용자 위임 SAS는 스토리지 계정 키로 서명된 SAS에 뛰어난 보안을 제공합니다. 가능하면 사용자 위임 SAS를 사용하는 것이 좋습니다. 자세한 내용은 SAS(공유 액세스 서명)를 사용하여 데이터에 대한 제한된 액세스 권한 부여를 참조하세요.

이 문서에서는 .NET용 Azure Blob Storage 클라이언트 라이브러리와 함께 스토리지 계정 키를 사용하여 Blob에 대한 서비스 SAS를 만드는 방법을 보여 줍니다.

서비스 SAS 정보

서비스 SAS는 계정 액세스 키로 서명됩니다. StorageSharedKeyCredential 클래스를 사용하여 서비스 SAS에 서명하는 데 사용되는 자격 증명을 만들 수 있습니다.

저장된 액세스 정책을 사용하여 SAS의 사용 권한 및 기간을 정의할 수도 있습니다. 기존에 저장된 액세스 정책의 이름을 제공하는 경우 해당 정책은 SAS와 연결됩니다. 저장된 액세스 정책에 대한 자세한 내용은 저장된 액세스 정책 정의를 참조하세요. 저장된 액세스 정책이 제공되지 않으면 이 문서의 코드 예제에서는 SAS에 대한 사용 권한 및 기간을 정의하는 방법을 보여 줍니다.

Blob에 서비스 SAS 만들기

다음 코드 예제에서는 BLOB 리소스에 대한 서비스 SAS를 만드는 방법을 보여 줍니다. 먼저 코드는 CanGenerateSasUri 속성을 확인하여 BlobClient 개체가 공유 키 자격 증명으로 승인되었는지 확인합니다. 그런 다음 BlobSasBuilder 클래스를 통해 서비스 SAS를 생성하고 GenerateSasUri를 호출하여 클라이언트 및 작성기 개체에 기반한 서비스 SAS URI를 만듭니다.

public static async Task<Uri> CreateServiceSASBlob(
    BlobClient blobClient,
    string storedPolicyName = null)
{
    // Check if BlobContainerClient object has been authorized with Shared Key
    if (blobClient.CanGenerateSasUri)
    {
        // Create a SAS token that's valid for one day
        BlobSasBuilder sasBuilder = new BlobSasBuilder()
        {
            BlobContainerName = blobClient.GetParentBlobContainerClient().Name,
            BlobName = blobClient.Name,
            Resource = "b"
        };

        if (storedPolicyName == null)
        {
            sasBuilder.ExpiresOn = DateTimeOffset.UtcNow.AddDays(1);
            sasBuilder.SetPermissions(BlobContainerSasPermissions.Read);
        }
        else
        {
            sasBuilder.Identifier = storedPolicyName;
        }

        Uri sasURI = blobClient.GenerateSasUri(sasBuilder);

        return sasURI;
    }
    else
    {
        // Client object is not authorized via Shared Key
        return null;
    }
}

서비스 SAS를 사용하여 클라이언트 개체에 권한 부여

다음 코드 예는 서비스 SAS를 사용하여 BlobClient 개체에 권한을 부여하는 방법을 보여 줍니다. 이 클라이언트 개체는 SAS에서 부여한 권한에 따라 Blob 리소스에 작업을 수행하는 데 사용할 수 있습니다.

먼저 계정 액세스 키로 서명된 BlobServiceClient 개체를 만듭니다.

string accountName = "<storage-account-name>";
string accountKey = "<storage-account-key";
StorageSharedKeyCredential storageSharedKeyCredential =
    new(accountName, accountKey);
BlobServiceClient blobServiceClient = new BlobServiceClient(
    new Uri($"https://{accountName}.blob.core.windows.net"),
    storageSharedKeyCredential);

그런 다음, 이전 예제에 나타난 대로 서비스 SAS를 생성하고 SAS를 사용하여 BlobClient 개체에 권한을 부여합니다.

// Create a Uri object with a service SAS appended
BlobClient blobClient = blobServiceClient
    .GetBlobContainerClient("sample-container")
    .GetBlobClient("sample-blob.txt");
Uri blobSASURI = await CreateServiceSASBlob(blobClient);

// Create a blob client object representing 'sample-blob.txt' with SAS authorization
BlobClient blobClientSAS = new BlobClient(blobSASURI);

저장된 액세스 정책 정의

저장된 액세스 정책은 서버 쪽의 서비스 수준 SAS(공유 액세스 서명)에 대한 제어 수준을 높입니다. 저장된 액세스 정책을 설정하면 공유 액세스 서명을 그룹화하고 정책의 적용을 받는 서명에 추가적인 제약을 적용하는 데 도움이 됩니다.

저장된 액세스 정책을 사용하면 서명의 시작 시간, 만료 시간 또는 사용 권한을 변경할 수 있습니다. 또한 저장된 액세스 정책을 사용하여 발행된 서명을 취소할 수 있습니다. 이 섹션에서는 Blob 컨테이너에 중점을 두지만 저장된 액세스 정책은 파일 공유, 큐 및 테이블에 대해서도 지원됩니다.

컨테이너 리소스에 저장된 액세스 정책을 관리하려면 BlobContainerClient 개체에서 다음 메서드 중 하나를 호출합니다.

저장된 액세스 정책 만들기 또는 수정

한 리소스에 대해 한 번에 최대 5개의 액세스 정책을 설정할 수 있습니다. 고유 Id 필드의 각 SignedIdentifier 필드는 하나의 액세스 정책에 해당합니다. 한 번에 5개 이상의 액세스 정책을 설정하려고 하면 서비스가 400 (Bad Request) 상태 코드를 반환합니다.

다음 코드 예제에서는 컨테이너 리소스에 두 개의 저장된 액세스 정책을 만드는 방법을 보여줍니다.

public static async Task CreateStoredAccessPolicyAsync(BlobContainerClient containerClient)
{
    // Create a stored access policy with read and write permissions, valid for one day
    List<BlobSignedIdentifier> signedIdentifiers = new List<BlobSignedIdentifier>
    {
        new BlobSignedIdentifier
        {
            Id = "sample-read-write-policy",
            AccessPolicy = new BlobAccessPolicy
            {
                StartsOn = DateTimeOffset.UtcNow,
                ExpiresOn = DateTimeOffset.UtcNow.AddDays(1),
                Permissions = "rw"
            }
        },
        new BlobSignedIdentifier
        {
            Id = "sample-read-policy",
            AccessPolicy = new BlobAccessPolicy
            {
                StartsOn = DateTimeOffset.UtcNow,
                ExpiresOn = DateTimeOffset.UtcNow.AddDays(1),
                Permissions = "r"
            }
        }
    };

    // Set the container's access policy
    await containerClient.SetAccessPolicyAsync(permissions: signedIdentifiers);
}

기존 정책을 수정할 수도 있습니다. 다음 코드 예제에서는 단일 저장된 액세스 정책을 수정하여 정책 만료 날짜를 업데이트하는 방법을 보여줍니다.

public static async Task ModifyStoredAccessPolicyAsync(BlobContainerClient containerClient)
{
    BlobContainerAccessPolicy accessPolicy = await containerClient.GetAccessPolicyAsync();
    List<BlobSignedIdentifier> signedIdentifiers = accessPolicy.SignedIdentifiers.ToList();

    // Modify the expiration date a single policy
    var samplePolicy = signedIdentifiers.FirstOrDefault(item => item.Id == "sample-read-policy");
    samplePolicy.AccessPolicy.PolicyExpiresOn = DateTimeOffset.UtcNow.AddDays(7);

    // Update the container's access policy
    await containerClient.SetAccessPolicyAsync(permissions: signedIdentifiers);
}

저장된 액세스 정책 취소 또는 삭제

저장된 액세스 정책을 철회하려면 저장된 액세스 정책을 삭제하거나, 서명된 식별자를 변경하여 이름을 바꾸거나, 만료 시간을 과거의 값으로 변경하면 됩니다. 서명된 식별자를 변경하면 모든 기존 서명과 저장된 액세스 정책 간의 연결이 끊어집니다. 만료 시간을 과거의 값으로 변경하면 연결된 서명이 모두 만료됩니다. 저장된 액세스 정책을 삭제하거나 수정하면 해당 정책과 연결된 모든 공유 액세스 서명이 즉시 영향을 받습니다.

다음 코드 예제에서는 서명된 식별자에 대한 Id 속성을 변경하여 정책을 취소하는 방법을 보여줍니다.

public static async Task RevokeStoredAccessPolicyAsync(BlobContainerClient containerClient)
{
    BlobContainerAccessPolicy accessPolicy = await containerClient.GetAccessPolicyAsync();
    List<BlobSignedIdentifier> signedIdentifiers = accessPolicy.SignedIdentifiers.ToList();

    // Revoke a single policy by changing its name
    var samplePolicy = signedIdentifiers.FirstOrDefault(item => item.Id == "sample-read-policy");
    samplePolicy.Id = "sample-read-policy-revoke";

    // Update the container's access policy
    await containerClient.SetAccessPolicyAsync(permissions: signedIdentifiers);
}

또한 빈 permissions 매개 변수를 사용하여 SetAccessPolicyAsync를 호출하여 컨테이너 리소스에서 모든 액세스 정책을 제거할 수 있습니다. 다음 예제에서는 지정된 컨테이너에서 저장된 모든 액세스 정책을 모두 삭제하는 방법을 보여줍니다.

public static async Task DeleteStoredAccessPolicyAsync(BlobContainerClient containerClient)
{
    // Remove all stored access policies for the container resource
    await containerClient.SetAccessPolicyAsync();
}

리소스

.NET용 Azure Blob Storage 클라이언트 라이브러리를 사용하여 서비스 SAS를 만드는 방법에 대해 자세히 알아보려면 다음 리소스를 참조하세요.

클라이언트 라이브러리 리소스

참고 항목