액세스제어 목록(ACL) 만들기 및 관리

개요

이 페이지에서는 액세스제어 목록(ACL)을 사용하여 버킷 및 객체에 액세스를 제어하는 방법을 설명합니다. ACL은 버킷 및 객체에 액세스할 수 있는 사람 그리고 이들에게 제공되는 액세스 권한 수준을 정의하는 데 사용할 수 있는 메커니즘입니다.

리소스 액세스를 제어하기 위해 ACL을 사용해야 하는지 여부에 대한 자세한 내용은 ACL 개요를 참조하세요.

필요한 역할

ACL을 만들고 관리하는 데 필요한 권한을 얻으려면 관리자에게 ACL을 만들고 관리하려는 객체가 포함된 버킷에 대한 스토리지 관리자(roles/storage.admin) IAM 역할을 부여해 달라고 요청하세요.

이 사전 정의된 역할에는 ACL 생성 및 관리를 위해 필요한 권한이 포함되어 있습니다. 필요한 정확한 권한을 보려면 필수 권한 섹션을 확장하세요.

필수 권한

  • storage.buckets.get
  • storage.buckets.list
    • 이 권한은 Google Cloud 콘솔을 사용하여 이 페이지의 태스크를 수행하는 경우에만 필요합니다.
  • storage.buckets.setIamPolicy
  • storage.buckets.update
  • storage.objects.get
  • storage.objects.getIamPolicy
  • storage.objects.setIamPolicy
  • storage.objects.update

커스텀 역할로도 이러한 권한을 얻을 수 있습니다.

버킷의 역할 부여에 대한 자세한 내용은 버킷에 IAM 사용을 참조하세요.

ACL 설정 또는 수정

콘솔

  1. Google Cloud 콘솔에서 Cloud Storage 브라우저로 이동합니다.
    Cloud Storage 브라우저로 이동

  2. 버킷 목록에서 ACL을 수정하려는 객체가 포함된 버킷의 이름을 클릭합니다.

  3. ACL을 설정하거나 수정할 객체의 이름을 클릭합니다.

  4. 액세스 수정을 클릭합니다.

    객체의 현재 ACL이 포함된 권한 대화상자가 열립니다.

  5. + 항목 추가를 클릭합니다.

  6. 권한을 부여할 항목 유형을 선택합니다.

    항목은 권한을 얻는 당사자 유형을 지정합니다(예: 사용자 또는 그룹). 항목에 지원되는 값 목록은 액세스 제어 범위를 참조하세요.

  7. 이름에 값을 입력합니다.

    이름은 특정 사용자, 그룹 또는 다른 항목 유형을 식별합니다. 이름에 지원되는 값 목록은 액세스 제어 범위를 참조하세요.

    항목이름을 통해 권한이 적용되는 사람을 정의합니다.

  8. 액세스에서 값을 선택합니다.

    액세스는 객체에 설정할 권한을 정의합니다. 액세스에 지원되는 값 목록은 액세스 제어 권한을 참조하세요.

  9. 저장을 클릭합니다.

Google Cloud 콘솔에서 실패한 Cloud Storage 작업에 대한 자세한 오류 정보를 가져오는 방법은 문제 해결을 참조하세요.

명령줄

객체에 대한 개별 권한 부여를 추가, 수정 또는 삭제하려면 관련 플래그와 함께 objects update 명령어를 사용합니다.

gcloud storage objects update gs://BUCKET_NAME/OBJECT_NAME FLAG

각 항목의 의미는 다음과 같습니다.

  • BUCKET_NAME은 수정이 적용되는 객체가 포함된 버킷의 이름입니다. 예를 들면 example-travel-maps입니다.

  • OBJECT_NAME은 수정이 적용되는 객체의 이름입니다. 예를 들면 paris.jpg입니다.

  • FLAG는 다음 중 하나입니다.

    • --add-acl-grant + 추가 또는 수정할 권한 부여. 예를 들면 --add-acl-grant=entity=user-jane@gmail.com,role=READER입니다.

    • --remove-acl-grant + 액세스 권한을 삭제하려는 항목. 예를 들면 --remove-acl-grant=user-jane@gmail.com입니다.

객체의 모든 ACL을 교체하려면 다음 안내를 따르세요.

  1. JSON 또는 YAML 형식의 파일에 ACL을 정의합니다.

  2. objects update 명령어를 --acl-file 플래그와 함께 사용합니다.

    gcloud storage objects update gs://BUCKET_NAME/OBJECT_NAME --acl-file=FILE_LOCATION

    각 항목의 의미는 다음과 같습니다.

    • BUCKET_NAME은 ACL이 적용되는 객체가 포함된 버킷의 이름입니다. 예를 들면 example-travel-maps입니다.

    • OBJECT_NAME은 ACL이 적용되는 객체의 이름입니다. 예를 들면 paris.jpg입니다.

    • FILE_LOCATION은 정의한 ACL이 포함된 파일의 로컬 경로입니다. 예를 들면 Desktop/acls.json입니다.

예시 ACL 파일의 콘텐츠가 아래에 표시되어 있습니다. 이 ACL은 867489160491 프로젝트의 소유자와 jane@gmail.com 사용자에게 paris.jpg 객체에 대한 OWNER 권한을 부여하고 gs-announce 그룹 구성원에게 이 객체에 대한 READER 권한을 부여합니다.

[
  {
    "entity": "project-owners-867489160491",
    "role": "OWNER",
    "projectTeam": {
      "projectNumber": "867489160491",
      "team": "owners"
    },
  },
  {
    "entity": "user-jane@gmail.com",
    "email": "jane@gmail.com",
    "role": "OWNER"
  },
  {
    "entity": "group-gs-announce@googlegroups.com",
    "email": "gs-announce@googlegroups.com",
    "role": "READER"
  }
]

클라이언트 라이브러리

C++

자세한 내용은 Cloud Storage C++ API 참고 문서를 확인하세요.

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

다음 샘플은 ACL을 객체에 추가합니다.

namespace gcs = ::google::cloud::storage;
using ::google::cloud::StatusOr;
[](gcs::Client client, std::string const& bucket_name,
   std::string const& object_name, std::string const& entity) {
  StatusOr<gcs::ObjectAccessControl> patched_acl =
      client.CreateObjectAcl(bucket_name, object_name, entity,
                             gcs::ObjectAccessControl::ROLE_OWNER());

  if (!patched_acl) throw std::move(patched_acl).status();
  std::cout << "ACL entry for " << patched_acl->entity() << " in object "
            << patched_acl->object() << " in bucket " << patched_acl->bucket()
            << " is now " << *patched_acl << "\n";
}

다음 샘플은 ACL을 객체에서 삭제합니다.

namespace gcs = ::google::cloud::storage;
using ::google::cloud::StatusOr;
[](gcs::Client client, std::string const& bucket_name,
   std::string const& object_name, std::string const& entity) {
  StatusOr<gcs::ObjectMetadata> original_metadata = client.GetObjectMetadata(
      bucket_name, object_name, gcs::Projection::Full());
  if (!original_metadata) throw std::move(original_metadata).status();

  std::vector<gcs::ObjectAccessControl> original_acl =
      original_metadata->acl();
  auto it = std::find_if(original_acl.begin(), original_acl.end(),
                         [entity](gcs::ObjectAccessControl const& entry) {
                           return entry.entity() == entity &&
                                  entry.role() ==
                                      gcs::ObjectAccessControl::ROLE_OWNER();
                         });

  if (it == original_acl.end()) {
    std::cout << "Could not find entity " << entity << " for file "
              << object_name << " with role OWNER in bucket " << bucket_name
              << "\n";
    return;
  }

  gcs::ObjectAccessControl owner = *it;
  google::cloud::Status status =
      client.DeleteObjectAcl(bucket_name, object_name, owner.entity());

  if (!status.ok()) throw std::runtime_error(status.message());
  std::cout << "Deleted ACL entry for " << owner.entity() << " for file "
            << object_name << " in bucket " << bucket_name << "\n";
}

C#

자세한 내용은 Cloud Storage C# API 참조 문서를 확인하세요.

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

다음 샘플은 ACL을 객체에 추가합니다.


using Google.Apis.Storage.v1.Data;
using Google.Cloud.Storage.V1;
using System;

public class AddFileOwnerSample
{
    public Google.Apis.Storage.v1.Data.Object AddFileOwner(
        string bucketName = "your-unique-bucket-name",
        string objectName = "my-file-name",
        string userEmail = "dev@iam.gserviceaccount.com")
    {
        var storage = StorageClient.Create();
        var storageObject = storage.GetObject(bucketName, objectName, new GetObjectOptions
        {
            Projection = Projection.Full
        });

        storageObject.Acl.Add(new ObjectAccessControl
        {
            Bucket = bucketName,
            Entity = $"user-{userEmail}",
            Role = "OWNER",
        });
        var updatedObject = storage.UpdateObject(storageObject);
        Console.WriteLine($"Added user { userEmail} as an owner on file { objectName}.");
        return updatedObject;
    }
}

다음 샘플은 ACL을 객체에서 삭제합니다.


using Google.Cloud.Storage.V1;
using System;
using System.Linq;

public class RemoveFileOwnerSample
{
    public void RemoveFileOwner(
        string bucketName = "your-unique-bucket-name",
        string objectName = "your-object-name",
        string userEmail = "dev@iam.gserviceaccount.com")
    {
        var storage = StorageClient.Create();
        var storageObject = storage.GetObject(bucketName, objectName, new GetObjectOptions { Projection = Projection.Full });
        if (storageObject.Acl == null)
        {
            Console.WriteLine("No owner to remove");
        }
        else
        {
            storageObject.Acl = storageObject.Acl.Where((acl) => !(acl.Entity == $"user-{userEmail}" && acl.Role == "OWNER")).ToList();
            var updatedObject = storage.UpdateObject(storageObject);
            Console.WriteLine($"Removed user {userEmail} from file {objectName}.");
        }
    }
}

Go

자세한 내용은 Cloud Storage Go API 참조 문서를 확인하세요.

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

다음 샘플은 ACL을 객체에 추가합니다.

import (
	"context"
	"fmt"

	"cloud.google.com/go/storage"
)

// addFileOwner adds ACL to the specified object.
func addFileOwner(bucket, object string, entity storage.ACLEntity) error {
	// bucket := "bucket-name"
	// object := "object-name"
	// entity := storage.AllUsers
	role := storage.RoleOwner

	ctx := context.Background()
	client, err := storage.NewClient(ctx)
	if err != nil {
		return fmt.Errorf("storage.NewClient: %w", err)
	}
	defer client.Close()

	acl := client.Bucket(bucket).Object(object).ACL()
	if err := acl.Set(ctx, entity, role); err != nil {
		return fmt.Errorf("ACLHandle.Set: %w", err)
	}
	return nil
}

다음 샘플은 ACL을 객체에서 삭제합니다.

import (
	"context"
	"fmt"

	"cloud.google.com/go/storage"
)

// removeFileOwner removes default ACL from the given object.
func removeFileOwner(bucket, object string, entity storage.ACLEntity) error {
	// bucket := "bucket-name"
	// object := "object-name"
	// entity := storage.AllUsers
	ctx := context.Background()
	client, err := storage.NewClient(ctx)
	if err != nil {
		return fmt.Errorf("storage.NewClient: %w", err)
	}
	defer client.Close()

	acl := client.Bucket(bucket).Object(object).ACL()
	if err := acl.Delete(ctx, entity); err != nil {
		return fmt.Errorf("ACLHandle.Delete: %w", err)
	}
	return nil
}

Java

자세한 내용은 Cloud Storage Java API 참조 문서를 확인하세요.

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

다음 샘플은 ACL을 객체에 추가합니다.


import com.google.cloud.storage.Acl;
import com.google.cloud.storage.Acl.Role;
import com.google.cloud.storage.Acl.User;
import com.google.cloud.storage.Blob;
import com.google.cloud.storage.BlobId;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;

public class AddFileOwner {

  public static void addFileOwner(
      String projectId, String bucketName, String userEmail, String blobName) {
    // The ID of your GCP project
    // String projectId = "your-project-id";

    // The ID of your GCS bucket
    // String bucketName = "your-unique-bucket-name";

    // Email of the user you wish to add as a file owner
    // String userEmail = "someuser@domain.com"

    // The name of the blob/file that you wish to modify permissions on
    // String blobName = "your-blob-name";

    Storage storage = StorageOptions.newBuilder().setProjectId(projectId).build().getService();
    Blob blob = storage.get(BlobId.of(bucketName, blobName));
    Acl newOwner = Acl.of(new User(userEmail), Role.OWNER);

    blob.createAcl(newOwner);
    System.out.println(
        "Added user "
            + userEmail
            + " as an owner on file "
            + blobName
            + " in bucket "
            + bucketName);
  }
}

다음 샘플은 ACL을 객체에서 삭제합니다.


import com.google.cloud.storage.Acl.User;
import com.google.cloud.storage.Blob;
import com.google.cloud.storage.BlobId;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;

public class RemoveFileOwner {

  public static void removeFileOwner(
      String projectId, String bucketName, String userEmail, String blobName) {
    // The ID of your GCP project
    // String projectId = "your-project-id";

    // The ID of your GCS bucket
    // String bucketName = "your-unique-bucket-name";

    // Email of the user you wish to remove as a file owner
    // String userEmail = "someuser@domain.com"

    // The name of the blob/file that you wish to modify permissions on
    // String blobName = "your-blob-name";

    Storage storage = StorageOptions.newBuilder().setProjectId(projectId).build().getService();
    Blob blob = storage.get(BlobId.of(bucketName, blobName));
    User ownerToRemove = new User(userEmail);

    boolean success = blob.deleteAcl(ownerToRemove);
    if (success) {
      System.out.println(
          "Removed user "
              + userEmail
              + " as an owner on file "
              + blobName
              + " in bucket "
              + bucketName);
    } else {
      System.out.println("User " + userEmail + " was not found");
    }
  }
}

Node.js

자세한 내용은 Cloud Storage Node.js API 참조 문서를 확인하세요.

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

다음 샘플은 ACL을 객체에 추가합니다.

/**
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// The ID of your GCS bucket
// const bucketName = 'your-unique-bucket-name';

// The name of the file to access
// const fileName = 'file.txt';

// The email address of the user to add
// const userEmail = 'user-email-to-add';

// Imports the Google Cloud client library
const {Storage} = require('@google-cloud/storage');

// Creates a client
const storage = new Storage();

async function addFileOwner() {
  await storage
    .bucket(bucketName)
    .file(fileName)
    .acl.owners.addUser(userEmail);

  console.log(`Added user ${userEmail} as an owner on file ${fileName}.`);
}

addFileOwner().catch(console.error);

다음 샘플은 ACL을 객체에서 삭제합니다.

/**
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// The ID of your GCS bucket
// const bucketName = 'your-unique-bucket-name';

// The ID of your GCS file
// const fileName = 'your-file-name';

// The email address of the user to remove
// const userEmail = 'user-email-to-remove';

// Imports the Google Cloud client library
const {Storage} = require('@google-cloud/storage');

// Creates a client
const storage = new Storage();

async function removeFileOwner() {
  // Removes the user from the access control list of the file. You can use
  // deleteAllUsers(), deleteDomain(), deleteProject(), deleteGroup(), and
  // deleteAllAuthenticatedUsers() to remove access for different types of entities.
  await storage
    .bucket(bucketName)
    .file(fileName)
    .acl.owners.deleteUser(userEmail);

  console.log(`Removed user ${userEmail} from file ${fileName}.`);
}

removeFileOwner().catch(console.error);

PHP

자세한 내용은 Cloud Storage PHP API 참조 문서를 확인하세요.

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

다음 샘플은 ACL을 객체에 추가합니다.

use Google\Cloud\Storage\StorageClient;

/**
 * Add an entity and role to an object's ACL.
 *
 * @param string $bucketName The name of your Cloud Storage bucket.
 *        (e.g. 'my-bucket')
 * @param string $objectName The name of your Cloud Storage object.
 *        (e.g. 'my-object')
 * @param string $entity The entity for which to update access controls.
 *        (e.g. 'user-example@domain.com')
 * @param string $role The permissions to add for the specified entity.
 *        (e.g. 'OWNER')
 */
function add_object_acl(string $bucketName, string $objectName, string $entity, string $role): void
{
    $storage = new StorageClient();
    $bucket = $storage->bucket($bucketName);
    $object = $bucket->object($objectName);
    $acl = $object->acl();
    $acl->add($entity, $role);
    printf('Added %s (%s) to gs://%s/%s ACL' . PHP_EOL, $entity, $role, $bucketName, $objectName);
}

다음 샘플은 ACL을 객체에서 삭제합니다.

use Google\Cloud\Storage\StorageClient;

/**
 * Delete an entity from an object's ACL.
 *
 * @param string $bucketName The name of your Cloud Storage bucket.
 *        (e.g. 'my-bucket')
 * @param string $objectName The name of your Cloud Storage object.
 *        (e.g. 'my-object')
 * @param string $entity The entity for which to update access controls.
 *        (e.g. 'user-example@domain.com')
 */
function delete_object_acl(string $bucketName, string $objectName, string $entity): void
{
    $storage = new StorageClient();
    $bucket = $storage->bucket($bucketName);
    $object = $bucket->object($objectName);
    $acl = $object->acl();
    $acl->delete($entity);
    printf('Deleted %s from gs://%s/%s ACL' . PHP_EOL, $entity, $bucketName, $objectName);
}

Python

자세한 내용은 Cloud Storage Python API 참조 문서를 확인하세요.

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

다음 샘플은 ACL을 객체에 추가합니다.

from google.cloud import storage


def add_blob_owner(bucket_name, blob_name, user_email):
    """Adds a user as an owner on the given blob."""
    # bucket_name = "your-bucket-name"
    # blob_name = "your-object-name"
    # user_email = "name@example.com"

    storage_client = storage.Client()
    bucket = storage_client.bucket(bucket_name)
    blob = bucket.blob(blob_name)

    # Reload fetches the current ACL from Cloud Storage.
    blob.acl.reload()

    # You can also use `group`, `domain`, `all_authenticated` and `all` to
    # grant access to different types of entities. You can also use
    # `grant_read` or `grant_write` to grant different roles.
    blob.acl.user(user_email).grant_owner()
    blob.acl.save()

    print(
        "Added user {} as an owner on blob {} in bucket {}.".format(
            user_email, blob_name, bucket_name
        )
    )

다음 샘플은 ACL을 객체에서 삭제합니다.

from google.cloud import storage


def remove_blob_owner(bucket_name, blob_name, user_email):
    """Removes a user from the access control list of the given blob in the
    given bucket."""
    # bucket_name = "your-bucket-name"
    # blob_name = "your-object-name"
    # user_email = "name@example.com"

    storage_client = storage.Client()
    bucket = storage_client.bucket(bucket_name)
    blob = bucket.blob(blob_name)

    # You can also use `group`, `domain`, `all_authenticated` and `all` to
    # remove access for different types of entities.
    blob.acl.user(user_email).revoke_read()
    blob.acl.user(user_email).revoke_write()
    blob.acl.user(user_email).revoke_owner()
    blob.acl.save()

    print(
        f"Removed user {user_email} from blob {blob_name} in bucket {bucket_name}."
    )

Ruby

자세한 내용은 Cloud Storage Ruby API 참조 문서를 확인하세요.

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

다음 샘플은 ACL을 객체에 추가합니다.

# The ID of your GCS bucket
# bucket_name = "your-unique-bucket-name"
# file_name   = "Name of a file in the Storage bucket"
# email       = "Google Cloud Storage ACL Entity email"

require "google/cloud/storage"

storage = Google::Cloud::Storage.new
bucket  = storage.bucket bucket_name
file    = bucket.file file_name

file.acl.add_owner email

puts "Added OWNER permission for #{email} to #{file_name}"

다음 샘플은 ACL을 객체에서 삭제합니다.

# The ID of your GCS bucket
# bucket_name = "your-unique-bucket-name"
# file_name   = "Name of a file in the Storage bucket"
# email       = "Google Cloud Storage ACL Entity email"

require "google/cloud/storage"

storage = Google::Cloud::Storage.new
bucket  = storage.bucket bucket_name
file    = bucket.file file_name

file.acl.delete email

puts "Removed ACL permissions for #{email} from #{file_name}"

REST API

JSON API

객체를 생성할 때는 요청 본문에 acl[] 속성을 지정하거나 insert 요청에 predefinedAcl 쿼리 매개변수를 지정할 수 있습니다. 기존 객체의 경우에는 patch 또는 update 요청에 acl[] 속성이나 predefinedAcl 쿼리 매개변수를 지정합니다.

객체 ACL 속성의 정의는 ObjectAccessControls 리소스를 참조하세요.

  1. JSON 파일에서 ACL을 정의합니다.

    예를 들어 ACL이 867489160491 프로젝트 소유자 및 jane@gmail.com 사용자에게 OWNER 권한을 부여하고 gs-announce 그룹의 구성원에게 READER 권한을 부여하면 다음 콘텐츠가 포함된 acls.json이라는 파일이 생성됩니다.

    {
    "acl": [
      {
        "entity": "project-owners-867489160491",
        "role": "OWNER",
        "projectTeam": {
          "projectNumber": "867489160491",
          "team": "owners"
        }
      },
      {
        "entity": "user-jane@gmail.com",
        "role": "OWNER",
        "email": "jane@gmail.com"
      },
      {
        "entity": "group-gs-announce@googlegroups.com",
        "role": "READER",
        "email": "gs-announce@googlegroups.com"
      }
    ]
    }
    
  2. patch 요청을 JSON 파일과 함께 보내고 ACL을 설정할 객체를 지정합니다.

예를 들어 다음 cURL 명령어는 acls.json 문서의 JSON 페이로드를 example-travel-maps 버킷의 paris.jpg라는 객체에 적용합니다.

curl -X PATCH --data @acls.json -H "Content-Type: application/json" \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    https://storage.googleapis.com/storage/v1/b/example-travel-maps/o/paris.jpg

XML API

XML API에서는 ACL을 XML 형식으로 사용합니다. XML 문서를 요청 본문에 첨부하여 버킷 및 객체 ACL을 변경해야 합니다. 버킷 및 객체 ACL을 얻을 때 XML 문서가 반환됩니다. XML 문서에는 개별 버킷 또는 객체 ACL 항목이 포함되어 있습니다.

  • PUT Bucket 요청으로 버킷을 만든 후에는 두 번째 PUT Bucket 요청을 ?acl 매개변수와 함께 사용하여 버킷 ACL을 변경합니다.

  • PUT Object 요청으로 객체를 업로드한 후에는 ?acl 매개변수 또는 x-googl-acl 요청 헤더를 사용하여 다른 PUT 요청으로 ACL을 변경합니다.

예를 들어 다음 cURL 명령어는 acls.xml 문서의 XML 페이로드를 example-travel-maps 버킷의 paris.jpg라는 객체에 적용합니다.

curl -X PUT --data-binary @acls.xml \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    https://storage.googleapis.com/example-travel-maps/paris.jpg?acl

XML 문서에 다음 ACL 문법을 사용합니다.

요소 설명
AccessControlList EntriesOwner 요소의 컨테이너입니다.
Owner DisplayNameID 요소의 컨테이너입니다. 객체는 항상 업로드한 사용자의 소유이기 때문에 이 요소는 객체에 필수가 아닙니다. 이 요소는 마이그레이션 시나리오에서 Amazon S3 ACL 문법을 사용 중일 때 사용됩니다.

Amazon Simple Storage Service™ 및 Amazon S3™는 미국 및/또는 다른 국가에서 사용되는 Amazon.com, Inc. 또는 해당 계열사의 상표입니다.
ID 버킷 소유자의 Google Cloud Storage ID입니다.
DisplayName 현재 구현되어 있지 않습니다. 값은 항상 빈 문자열입니다.
Entries 0개 이상의 Entry 요소를 위한 컨테이너입니다.
Entry ScopePermission 요소의 컨테이너입니다. Entry는 하나의 Scope와 하나의 Permission 요소만 포함해야 합니다.
Scope ACL 범위를 정의하는 ID, EmailAddress 또는 Domain 요소의 컨테이너입니다. 이 요소에는 UserByID, UserByEmail, GroupByID, GroupByEmail, GroupByDomain, AllUsers 또는 AllAuthenticatedUsers 값 중 하나를 포함하는 type 속성이 있어야 합니다.
ID 권한 항목이 ID로 지정될 때 수혜자의 식별자입니다.
EmailAddress 권한 항목이 이메일로 지정될 때 수혜자의 이메일 식별자입니다.
Domain 권한 항목이 도메인으로 지정될 때 수혜자의 도메인 식별자입니다.
Name 지정할 수 있거나 범위가 UserByEmail 또는 GroupByEmail인 경우 자동으로 추가될 수 있는 선택적 요소입니다.
Permission 부여된 권한입니다(READ, WRITE, FULL_CONTROL).

XML API를 사용하여 ACL 작업 시 주의 사항은 다음과 같습니다.

  • 위에 설명된 XML 형식만 사용할 수 있습니다.
  • 중복된 범위를 설정할 수 없습니다.

    ACL XML에 여러 개의 항목이 있을 수 있지만 범위가 중복된 항목은 있을 수 없습니다. 예를 들어 jane@example.com의 같은 범위 요소를 사용하는 항목이 2개 있을 수는 없습니다.

다음 예는 서로 다른 버킷 ACL 항목을 보여줍니다.

<?xml version="1.0" encoding="UTF-8"?>
<AccessControlList>
  <Owner>
    <ID>00b4903a9721...</ID>
  </Owner>
  <Entries>
    <Entry>
      <Scope type="GroupById">
        <ID>00b4903a9722...</ID>
      </Scope>
      <Permission>FULL_CONTROL</Permission>
    </Entry>
    <Entry>
      <Scope type="GroupByDomain">
        <Domain>example.com</Domain>
      </Scope>
      <Permission>READ</Permission>
    </Entry>
    <Entry>
      <Scope type="GroupByEmail">
        <EmailAddress>gs-announce@googlegroups.com</EmailAddress>
      </Scope>
      <Permission>READ</Permission>
    </Entry>
    <Entry>
      <Scope type="UserByEmail">
        <EmailAddress>jane@gmail.com</EmailAddress>
        <Name>jane</Name>
      </Scope>
      <Permission>READ</Permission>
    </Entry>
    <Entry>
      <Scope type="AllUsers"/>
      <Permission>READ</Permission>
    </Entry>
    <Entry>
      <Scope type="AllAuthenticatedUsers"/>
      <Permission>READ</Permission>
    </Entry>
  </Entries>
</AccessControlList>

ACL XML에서 Name 요소 설정

버킷이나 객체에서 ACL을 검색할 때 일부 항목에 <Name> 요소가 더 추가된 것을 볼 수 있습니다. 예를 들어 다음과 같은 항목을 볼 수 있습니다.

<Entry>
  <Scope type="UserByEmail">
    <EmailAddress>jane@gmail.com</EmailAddress>
    <Name>Jane</Name>
  </Scope>
  <Permission>FULL_CONTROL</Permission>
</Entry>

이러한 선택적 <Name> 요소는 다음 두 가지 상황에서 채워집니다.

  1. 버킷 또는 객체의 ACL에 <Name>이 요소로 포함된 경우

    ACL을 설정할 때 <Name> 요소를 ACL 항목에 포함하도록 선택할 수 있습니다. <Name> 요소 안에 어떠한 값이라도 제공할 수 있으며, Cloud Storage는 ACL을 삭제하거나 교체하기 전까지 이 값을 기억합니다. 이 방식은 Google Cloud Storage ID와 같이 쉽게 식별할 수 없는 식별자를 사용 중인 경우에 유용합니다.

  2. UserByEmail 또는 GroupByEmail 범위에 공개 Google 프로필이 포함된 경우

    이러한 범위 중 하나를 사용하고 있지만 <Name> 요소를 제공하지 않는 경우 Cloud Storage는 이메일 주소와 연관된 사용자 또는 Google 그룹이 공개 이름을 사용하는 공개 Google 프로필을 가지고 있는지 확인합니다. 공개 이름을 사용하는 Google 프로필이 있을 경우 Cloud Storage는 <Name> 요소에 공개 이름을 자동으로 채웁니다.

사전 정의된 ACL 적용

위에 나온 것처럼 전체 ACL을 한 번에 하나씩 지정하는 대신 특정 시나리오에 맞춤설정된 다수의 항목을 자동으로 적용하는 사전 정의된 ACL을 사용할 수 있습니다. Google Cloud CLI, JSON API, XML API를 사용하여 사전 정의된 ACL을 버킷이나 객체에 적용할 수 있습니다.

새 객체

객체 업로드 중에 사전 정의된 ACL을 객체에 적용하려면 다음과 같이 하세요.

콘솔

Google Cloud 콘솔을 사용하여 사전 정의된 ACL을 적용할 수 없습니다. 대신 gcloud storage를 사용하세요.

명령줄

gcloud storage cp 명령어를 --predefined-acl 플래그와 함께 사용합니다.

gcloud storage cp OBJECT gs://BUCKET_NAME --predefined-acl=PREDEFINED_ACL

예를 들어 example-travel-maps 버킷에 paris.jpg 객체를 업로드할 때 사전 정의된 ACL bucketOwnerRead를 적용하려면 다음을 입력합니다.

gcloud storage cp paris.jpg gs://example-travel-maps --predefined-acl=bucketOwnerRead

REST API

JSON API

insert 요청에 predefinedAcl 쿼리 문자열 매개변수를 사용하여 사전 정의된 ACL을 적용합니다.

예를 들어 example-travel-maps 버킷에 paris.jpg 객체를 업로드할 때 사전 정의된 ACL bucketOwnerRead를 적용하려면 다음을 입력합니다.

curl -X POST --data-binary @paris.jpg -H "Content-Type: image/jpeg" \
    -H "Authorization: Bearer $(gcloud auth print-access-token)"  \
    "https://storage.googleapis.com/upload/storage/v1/b/example-travel-maps/o?name=paris.jpg&predefinedAcl=bucketOwnerRead"

XML API

Put Object 요청에 x-goog-acl 헤더를 사용하여 사전 정의된 ACL을 요청합니다.

예를 들어 example-travel-maps 버킷에 paris.jpg 객체를 업로드할 때 사전 정의된 ACL bucket-owner-read를 적용하려면 다음을 입력합니다.

curl -X PUT --upload-file paris.jpg -H "x-goog-acl: bucket-owner-read" \
    -H "Authorization: Bearer $(gcloud auth print-access-token)"  \
    https://storage.googleapis.com/example-travel-maps/paris.jpg

기존 버킷 또는 객체

사전 정의된 ACL을 기존 버킷이나 객체에 적용할 수도 있습니다. 이는 하나의 사전 정의된 ACL에서 다른 사전 정의된 ACL로 변경하고자 하거나 커스텀 ACL을 사전 정의된 ACL로 업데이트하고자 하는 경우에 유용합니다.

콘솔

Google Cloud 콘솔을 사용하여 사전 정의된 ACL을 적용할 수 없습니다. 대신 gcloud storage를 사용하세요.

명령줄

objects update 명령어를 --predefined-acl 플래그와 함께 사용합니다.

gcloud storage objects update gs://BUCKET_NAME/OBJECT_NAME --predefined-acl=PREDEFINED_ACL_NAME

예를 들어 example-travel-maps 버킷의 paris.jpg 객체에 사전 정의된 ACL private를 적용하려면 다음을 입력합니다.

gcloud storage objects update gs://example-travel-maps/paris.jpg --predefined-acl=private

REST API

JSON API

predefinedAcl 쿼리 문자열 매개변수를 사용하고 patch 요청에 빈 acl 속성을 지정하여 사전 정의된 ACL을 적용합니다.

예를 들어 example-travel-maps 버킷의 paris.jpg 객체에 사전 정의된 ACL private를 적용하려면 다음을 입력합니다.

curl -X PATCH --data '{"acl": []}'  -H "Content-Type: application/json" \
    -H "Authorization: Bearer $(gcloud auth print-access-token)"  \
    https://storage.googleapis.com/storage/v1/b/example-travel-maps/o/paris.jpg?predefinedAcl=private

XML API

Put Object 요청에서 x-goog-acl 헤더를 acl 쿼리 문자열 파라미터와 함께 사용합니다. 하지만 요청에 XML 문서를 포함하지 않습니다.

예를 들어 example-travel-maps 버킷의 paris.jpg 객체에 사전 정의된 ACL private를 적용하려면 다음을 입력합니다.

curl -X PUT -H "Content-Length: 0" \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "x-goog-acl: private" \
    https://storage.googleapis.com/example-travel-maps/paris.jpg?acl

기본 객체 ACL 설정

새 객체를 생성할 때마다 ACL을 설정할 필요가 없도록 버킷에 기본 객체 ACL을 설정할 수 있습니다. 이후로는 해당 버킷에 추가되는 새 객체마다 명시적으로 적용된 ACL이 없는 객체는 모두 이 기본 객체 ACL이 적용됩니다. 예를 들어 특정 그룹의 사용자만 특정 버킷에서 대부분의 객체에 액세스하도록 지정하고자 할 수 있습니다. 이런 경우 기본 객체 ACL을 변경한 후에 객체를 버킷에 추가하면 됩니다. 이렇게 추가된 객체에는 지정한 기본 객체 ACL이 자동으로 적용됩니다. 하지만 특정 객체에 다른 ACL을 지정할 수도 있습니다. 그러면 이러한 객체에는 기본 ACL이 적용되지 않습니다.

버킷에서 기본 객체 ACL을 확인하고 변경하려면 다음 안내를 따르세요.

콘솔

Google Cloud 콘솔을 사용하여 기본 객체 ACL을 설정할 수 없습니다. 대신 gcloud storage를 사용하세요.

명령줄

  1. --format 플래그와 함께 buckets describe 명령어를 사용하여 버킷의 기본 객체 ACL을 검색합니다.

    gcloud storage buckets describe gs://BUCKET_NAME --format="default(default_acl)"

    여기서 BUCKET_NAME은 보려는 기본 객체 ACL이 있는 버킷의 이름입니다. 예를 들면 my-bucket입니다.

  2. 원하는 플래그와 함께 buckets update 명령어를 사용하여 버킷의 기본 객체 ACL을 수정합니다.

    gcloud storage buckets update gs://BUCKET_NAME FLAG

    각 항목의 의미는 다음과 같습니다.

    • BUCKET_NAME은 수정하려는 기본 객체 ACL이 있는 버킷의 이름입니다. 예를 들면 my-bucket입니다.

    • FLAG는 다음 중 하나입니다.

      • --add-default-object-acl-grant 및 버킷의 전체 기본 객체 ACL에 추가할 권한 부여

      • --default-object-acl-file 및 버킷의 새 기본 객체 ACL을 정의하는 로컬 파일의 경로

      • --predefined-default-object-acl 및 버킷의 기존 기본 객체 ACL을 대체할 사전 정의된 객체 ACL의 이름

      • --remove-default-object-acl-grant 및 버킷의 전체 기본 객체 ACL에서 삭제할 항목

클라이언트 라이브러리

C++

자세한 내용은 Cloud Storage C++ API 참고 문서를 확인하세요.

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

다음 샘플은 기본 객체 ACL을 버킷에 추가합니다.

namespace gcs = ::google::cloud::storage;
using ::google::cloud::StatusOr;
[](gcs::Client client, std::string const& bucket_name,
   std::string const& entity, std::string const& role) {
  StatusOr<gcs::ObjectAccessControl> default_object_acl =
      client.CreateDefaultObjectAcl(bucket_name, entity, role);
  if (!default_object_acl) throw std::move(default_object_acl).status();

  std::cout << "Role " << default_object_acl->role()
            << " will be granted default to " << default_object_acl->entity()
            << " on any new object created on bucket "
            << default_object_acl->bucket() << "\n"
            << "Full attributes: " << *default_object_acl << "\n";
}

다음 샘플은 기본 객체 ACL을 버킷에서 삭제합니다.

namespace gcs = ::google::cloud::storage;
[](gcs::Client client, std::string const& bucket_name,
   std::string const& entity) {
  google::cloud::Status status =
      client.DeleteDefaultObjectAcl(bucket_name, entity);

  if (!status.ok()) throw std::runtime_error(status.message());
  std::cout << "Deleted ACL entry for " << entity << " in bucket "
            << bucket_name << "\n";
}

C#

자세한 내용은 Cloud Storage C# API 참조 문서를 확인하세요.

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

다음 샘플은 버킷의 기본 객체 ACL을 출력합니다.


using Google.Apis.Storage.v1.Data;
using Google.Cloud.Storage.V1;
using System;
using System.Collections.Generic;

public class PrintBucketDefaultAclSample
{
    public IEnumerable<ObjectAccessControl> PrintBucketDefaultAcl(string bucketName = "your-unique-bucket-name")
    {
        var storage = StorageClient.Create();
        var bucket = storage.GetBucket(bucketName, new GetBucketOptions { Projection = Projection.Full });

        foreach (var acl in bucket.DefaultObjectAcl)
        {
            Console.WriteLine($"{acl.Role}:{acl.Entity}");
        }

        return bucket.DefaultObjectAcl;
    }
}

다음 샘플은 기본 객체 ACL을 버킷에 추가합니다.


using Google.Apis.Storage.v1.Data;
using Google.Cloud.Storage.V1;
using System;

public class AddBucketDefaultOwnerSample
{
    public Bucket AddBucketDefaultOwner(
        string bucketName = "your-unique-bucket-name",
        string userEmail = "dev@iam.gserviceaccount.com")
    {
        var storage = StorageClient.Create();
        var bucket = storage.GetBucket(bucketName, new GetBucketOptions { Projection = Projection.Full });

        bucket.DefaultObjectAcl.Add(new ObjectAccessControl
        {
            Bucket = bucketName,
            Entity = $"user-{userEmail}",
            Role = "OWNER",
        });
        var updatedBucket = storage.UpdateBucket(bucket);
        Console.WriteLine($"Added user {userEmail} as a default owner on bucket {bucketName}.");
        return updatedBucket;
    }
}

다음 샘플은 기본 객체 ACL을 버킷에서 삭제합니다.


using Google.Cloud.Storage.V1;
using System;
using System.Linq;

public class RemoveBucketDefaultOwnerSample
{
    public void RemoveBucketDefaultOwner(
        string bucketName = "your-unique-bucket-name",
        string userEmail = "user@iam.gserviceaccount.com")
    {
        var storage = StorageClient.Create();
        var bucket = storage.GetBucket(bucketName, new GetBucketOptions { Projection = Projection.Full });
        if (bucket.DefaultObjectAcl == null)
        {
            Console.WriteLine("No default owner to remove");
        }
        else
        {
            bucket.DefaultObjectAcl = bucket.DefaultObjectAcl.Where(acl => !(acl.Entity == $"user-{userEmail}" && acl.Role == "OWNER")).ToList();
            var updatedBucket = storage.UpdateBucket(bucket);
            Console.WriteLine($"Removed user {userEmail} from bucket {bucketName}.");
        }
    }
}

Go

자세한 내용은 Cloud Storage Go API 참조 문서를 확인하세요.

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

다음 샘플은 기본 객체 ACL을 버킷에 추가합니다.

import (
	"context"
	"fmt"

	"cloud.google.com/go/storage"
)

// addBucketDefaultOwner adds default ACL to the specified bucket.
func addBucketDefaultOwner(bucket string, entity storage.ACLEntity) error {
	// bucket := "bucket-name"
	// entity := storage.AllUsers
	role := storage.RoleOwner

	ctx := context.Background()
	client, err := storage.NewClient(ctx)
	if err != nil {
		return fmt.Errorf("storage.NewClient: %w", err)
	}
	defer client.Close()

	acl := client.Bucket(bucket).DefaultObjectACL()
	if err := acl.Set(ctx, entity, role); err != nil {
		return fmt.Errorf("ACLHandle.Set: %w", err)
	}
	return nil
}

다음 샘플은 기본 객체 ACL을 버킷에서 삭제합니다.

import (
	"context"
	"fmt"

	"cloud.google.com/go/storage"
)

// deleteDefaultBucketACL removes default ACL from a bucket.
func removeBucketDefaultOwner(bucket string, entity storage.ACLEntity) error {
	// bucket := "bucket-name"
	// entity := storage.AllUsers
	ctx := context.Background()
	client, err := storage.NewClient(ctx)
	if err != nil {
		return fmt.Errorf("storage.NewClient: %w", err)
	}
	defer client.Close()

	acl := client.Bucket(bucket).DefaultObjectACL()
	if err := acl.Delete(ctx, entity); err != nil {
		return fmt.Errorf("ACLHandle.Delete: %w", err)
	}
	return nil
}

Java

자세한 내용은 Cloud Storage Java API 참조 문서를 확인하세요.

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

다음 샘플은 기본 객체 ACL을 버킷에 추가합니다.


import com.google.cloud.storage.Acl;
import com.google.cloud.storage.Acl.Role;
import com.google.cloud.storage.Acl.User;
import com.google.cloud.storage.Bucket;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;

public class AddBucketDefaultOwner {

  public static void addBucketDefaultOwner(String bucketName, String userEmail) {

    // The ID of your GCS bucket
    // String bucketName = "your-unique-bucket-name";

    // The email of the user you wish to add as a default owner
    // String userEmail = "someuser@domain.com"

    Storage storage = StorageOptions.newBuilder().build().getService();
    Bucket bucket = storage.get(bucketName);
    Acl newDefaultOwner = Acl.of(new User(userEmail), Role.OWNER);

    bucket.createDefaultAcl(newDefaultOwner);
    System.out.println("Added user " + userEmail + " as an owner on " + bucketName);
  }
}

다음 샘플은 기본 객체 ACL을 버킷에서 삭제합니다.


import com.google.cloud.storage.Acl.User;
import com.google.cloud.storage.Bucket;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;

public class RemoveBucketDefaultOwner {

  public static void removeBucketDefaultOwner(String bucketName, String userEmail) {

    // The ID of your GCS bucket
    // String bucketName = "your-unique-bucket-name";

    // The email of the user you wish to remove as a default owner
    // String userEmail = "someuser@domain.com"

    Storage storage = StorageOptions.newBuilder().build().getService();
    Bucket bucket = storage.get(bucketName);
    User userToRemove = new User(userEmail);

    boolean success = bucket.deleteDefaultAcl(userToRemove);
    if (success) {
      System.out.println("Removed user " + userEmail + " as an owner on " + bucketName);
    } else {
      System.out.println("User " + userEmail + " was not found");
    }
  }
}

Node.js

자세한 내용은 Cloud Storage Node.js API 참조 문서를 확인하세요.

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

다음 샘플은 기본 객체 ACL을 버킷에 추가합니다.

/**
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// The ID of your GCS bucket
// const bucketName = 'your-unique-bucket-name';

// The email address of the user to add
// const userEmail = 'user-email-to-add';

// Imports the Google Cloud client library
const {Storage} = require('@google-cloud/storage');

// Creates a client
const storage = new Storage();

async function addBucketDefaultOwner() {
  // Makes the user an owner in the default ACL of the bucket. You can use
  // addAllUsers(), addDomain(), addProject(), addGroup(), and
  // addAllAuthenticatedUsers() to grant access to different types of entities.
  // You can also use "readers" and "writers" to grant different roles.
  await storage.bucket(bucketName).acl.default.owners.addUser(userEmail);

  console.log(`Added user ${userEmail} as an owner on bucket ${bucketName}.`);
}

addBucketDefaultOwner().catch(console.error);

다음 샘플은 기본 객체 ACL을 버킷에서 삭제합니다.

/**
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// The ID of your GCS bucket
// const bucketName = 'your-unique-bucket-name';

// The email address of the user to remove
// const userEmail = 'user-email-to-remove';

// Imports the Google Cloud client library
const {Storage} = require('@google-cloud/storage');

// Creates a client
const storage = new Storage();

async function removeBucketDefaultOwner() {
  // Removes the user from the access control list of the bucket. You can use
  // deleteAllUsers(), deleteDomain(), deleteProject(), deleteGroup(), and
  // deleteAllAuthenticatedUsers() to remove access for different types of entities.
  await storage.bucket(bucketName).acl.default.owners.deleteUser(userEmail);

  console.log(`Removed user ${userEmail} from bucket ${bucketName}.`);
}

removeBucketDefaultOwner().catch(console.error);

PHP

자세한 내용은 Cloud Storage PHP API 참조 문서를 확인하세요.

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

다음 샘플은 기본 객체 ACL을 버킷에 추가합니다.

use Google\Cloud\Storage\StorageClient;

/**
 * Add an entity and role to a bucket's default ACL.
 *
 * @param string $bucketName The name of your Cloud Storage bucket.
 *        (e.g. 'my-bucket')
 * @param string $entity The entity for which to update access controls.
 *        (e.g. 'user-example@domain.com')
 * @param string $role The permissions to add for the specified entity.
 *        (e.g. 'OWNER')
 */
function add_bucket_default_acl(string $bucketName, string $entity, string $role): void
{
    $storage = new StorageClient();
    $bucket = $storage->bucket($bucketName);
    $acl = $bucket->defaultAcl();
    $acl->add($entity, $role);
    printf('Added %s (%s) to gs://%s default ACL' . PHP_EOL, $entity, $role, $bucketName);
}

다음 샘플은 기본 객체 ACL을 버킷에서 삭제합니다.

use Google\Cloud\Storage\StorageClient;

/**
 * Delete an entity from a bucket's default ACL.
 *
 * @param string $bucketName The name of your Cloud Storage bucket.
 *        (e.g. 'my-bucket')
 * @param string $entity The entity for which to update access controls.
 *        (e.g. 'user-example@domain.com')
 */
function delete_bucket_default_acl(string $bucketName, string $entity): void
{
    $storage = new StorageClient();
    $bucket = $storage->bucket($bucketName);
    $acl = $bucket->defaultAcl();
    $acl->delete($entity);
    printf('Deleted %s from gs://%s default ACL' . PHP_EOL, $entity, $bucketName);
}

Python

자세한 내용은 Cloud Storage Python API 참조 문서를 확인하세요.

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

다음 샘플은 기본 객체 ACL을 버킷에 추가합니다.

from google.cloud import storage


def add_bucket_default_owner(bucket_name, user_email):
    """Adds a user as an owner in the given bucket's default object access
    control list."""
    # bucket_name = "your-bucket-name"
    # user_email = "name@example.com"

    storage_client = storage.Client()
    bucket = storage_client.bucket(bucket_name)

    # Reload fetches the current ACL from Cloud Storage.
    bucket.acl.reload()

    # You can also use `group`, `domain`, `all_authenticated` and `all` to
    # grant access to different types of entities. You can also use
    # `grant_read` or `grant_write` to grant different roles.
    bucket.default_object_acl.user(user_email).grant_owner()
    bucket.default_object_acl.save()

    print(
        "Added user {} as an owner in the default acl on bucket {}.".format(
            user_email, bucket_name
        )
    )

다음 샘플은 기본 객체 ACL을 버킷에서 삭제합니다.

from google.cloud import storage


def remove_bucket_default_owner(bucket_name, user_email):
    """Removes a user from the access control list of the given bucket's
    default object access control list."""
    # bucket_name = "your-bucket-name"
    # user_email = "name@example.com"

    storage_client = storage.Client()
    bucket = storage_client.bucket(bucket_name)

    # Reload fetches the current ACL from Cloud Storage.
    bucket.acl.reload()

    # You can also use `group`, `domain`, `all_authenticated` and `all` to
    # remove access for different types of entities.
    bucket.default_object_acl.user(user_email).revoke_read()
    bucket.default_object_acl.user(user_email).revoke_write()
    bucket.default_object_acl.user(user_email).revoke_owner()
    bucket.default_object_acl.save()

    print(
        f"Removed user {user_email} from the default acl of bucket {bucket_name}."
    )

Ruby

자세한 내용은 Cloud Storage Ruby API 참조 문서를 확인하세요.

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

다음 샘플은 기본 객체 ACL을 버킷에 추가합니다.

# The ID of your GCS bucket
# bucket_name = "your-unique-bucket-name"
# email       = "Google Cloud Storage ACL Entity email"

require "google/cloud/storage"

storage = Google::Cloud::Storage.new
bucket  = storage.bucket bucket_name

bucket.default_acl.add_owner email

puts "Added default OWNER permission for #{email} to #{bucket_name}"

다음 샘플은 기본 객체 ACL을 버킷에서 삭제합니다.

# The ID of your GCS bucket
# bucket_name = "your-unique-bucket-name"
# email       = "Google Cloud Storage ACL Entity email"

require "google/cloud/storage"

storage = Google::Cloud::Storage.new
bucket  = storage.bucket bucket_name

bucket.default_acl.delete email

puts "Removed default ACL permissions for #{email} from #{bucket_name}"

REST API

JSON API

  1. GET 요청을 사용하여 기본 객체 ACL을 검색합니다. 예를 들면 다음과 같습니다.

    curl -X GET -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        https://storage.googleapis.com/storage/v1/b/BUCKET_NAME?projection=full
    
  2. patch 요청을 사용하여 기본 객체 ACL을 바꿉니다. 예를 들어 다음 요청은 기본 객체 ACL을 example-travel-maps 버킷의 defacls.json에 지정된 ACL로 바꿉니다.

    curl -X PATCH --data @defacls.json -H "Content-Type: application/json" -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        https://storage.googleapis.com/storage/v1/b/example-travel-maps
    

    defacls.json의 예시는 다음과 같습니다.

    {
    "defaultObjectAcl": [
      {
        "email": "jane@gmail.com",
        "entity": "user-jane@gmail.com",
        "role": "READER"
      }
    ]
    }
    

XML API

  1. 버킷에 맞춘 GET 요청과 ?defaultObjectAcl 매개변수를 사용하여 기본 객체 ACL을 검색합니다. 예를 들면 다음과 같습니다.

    curl -X GET -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        https://storage.googleapis.com/BUCKET_NAME?defaultObjectAcl
    
  2. 버킷에 맞춘 PUT 요청과 ?defaultObjectAcl 매개변수를 사용하여 기본 객체 ACL을 acls.xml에 지정된 ACL로 바꿉니다. 예를 들면 다음과 같습니다.

    curl -X PUT --data-binary @acls.xml -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        http://storage.googleapis.com/BUCKET_NAME?defaultObjectAcl
    

    acls.xml의 예시는 다음과 같습니다.

    <AccessControlList>
      <Entries>
        <Entry>
          <Permission>FULL_CONTROL</Permission>
          <Scope type="GroupByEmail">
            <EmailAddress>travel-companions@googlegroups.com</EmailAddress>
          </Scope>
        </Entry>
      </Entries>
    </AccessControlList>
    

ACL 문법은 ACL 설정에서 설명합니다. 사전 정의된 ACL을 기본 객체 ACL로 지정할 수도 있습니다.

버킷의 기본 객체 ACL을 사전 정의된 ACL로 설정하려면 다음 안내를 따르세요.

콘솔

Google Cloud 콘솔을 사용하여 기본 객체 ACL을 설정할 수 없습니다. 대신 gcloud storage를 사용하세요.

명령줄

buckets update 명령어를 --predefined-default-object-acl 플래그와 함께 사용합니다.

gcloud storage buckets update gs://BUCKET_NAME --predefined-default-object-acl=PREDEFINED_ACL

각 항목의 의미는 다음과 같습니다.

  • BUCKET_NAME은 수정하려는 기본 객체 ACL이 있는 버킷의 이름입니다. 예를 들면 my-bucket입니다.

  • PREDEFINED_ACL은 유효한 사전 정의된 ACL의 이름입니다. 예를 들면 projectPrivate입니다.

REST API

JSON API

PUT 요청과 predefinedAcl 매개변수를 사용합니다.

예를 들면 다음과 같습니다.

curl -X PUT -H "Content-Length: 0" -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    https://storage.googleapis.com/storage/v1/b/BUCKET_NAME?predefinedAcl=private

XML API

버킷에 맞춘 PUT 요청과 ?defaultObjectAcl 매개변수 및 x-goog-acl 헤더를 사용합니다.

예를 들면 다음과 같습니다.

curl -X PUT -H "x-goog-acl: project-private" -H "Content-Length: 0" -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    http://storage.googleapis.com/BUCKET_NAME?defaultObjectAcl

새로 생성된 버킷의 기본 객체 ACL:

다음 예시에서는 자체 기본 객체 ACL을 요청의 일부로 지정하지 않으면 새로 생성된 버킷에 자동으로 적용되는 기본 객체 ACL을 보여줍니다. 버킷의 기본 객체 ACL이 변경되었는지 확인하려면 버킷의 현재 기본 객체 ACL을 다음 예시와 비교합니다.

콘솔

Google Cloud 콘솔을 사용하여 기본 객체 ACL을 작업할 수 없습니다. 대신 gcloud storage를 사용하세요.

명령줄

아래의 예에서 프로젝트 ID는 '123412341234'입니다. 사용자의 프로젝트 ID는 다릅니다.

defaultObjectAcl:
– entity: project-owners-123412341234
  etag: CAE=
  kind: storage#objectAccessControl
  projectTeam:
    projectNumber: '123412341234'
    team: owners
  role: OWNER
– entity: project-editors-123412341234
  etag: CAE=
  kind: storage#objectAccessControl
  projectTeam:
    projectNumber: '123412341234'
    team: editors
  role: OWNER
– entity: project-viewers-123412341234
  etag: CAE=
  kind: storage#objectAccessControl
  projectTeam:
    projectNumber: '123412341234'
    team: viewers
  role: READER

REST API

JSON API

아래의 예에서 프로젝트 ID는 '123412341234'입니다. 사용자의 프로젝트 ID는 다릅니다.

"defaultObjectAcl": [
  {
    "kind": "storage#objectAccessControl",
    "entity": "project-owners-123412341234",
    "role": "OWNER",
    "projectTeam": {
      "projectNumber": "123412341234",
      "team": "owners"
    }
  },
  {
    "kind": "storage#objectAccessControl",
    "entity": "project-editors-123412341234",
    "role": "OWNER",
    "projectTeam": {
      "projectNumber": "123412341234",
      "team": "editors"
    }
  },
  {
    "kind": "storage#objectAccessControl",
    "entity": "project-viewers-123412341234",
    "role": "READER",
    "projectTeam": {
      "projectNumber": "123412341234",
      "team": "viewers"
    }
  }
]

XML API

아래의 예에서 프로젝트 역할 ID는 '00b4903a97...'로 시작됩니다. 사용자의 프로젝트 ID는 다릅니다.

<?xml version='1.0' encoding='UTF-8'?>
<AccessControlList>
  <Entries>
    <Entry>
      <Scope type='GroupById'>
        <ID>00b4903a9721...</ID>
      </Scope>
      <Permission>FULL_CONTROL</Permission>
    </Entry>
    <Entry>
      <Scope type='GroupById'>
        <ID>00b4903a9722...</ID>
      </Scope>
      <Permission>FULL_CONTROL</Permission>
    </Entry>
    <Entry>
      <Scope type='GroupById'>
        <ID>00b4903a9723...</ID>
      </Scope>
      <Permission>READ</Permission>
    </Entry>
  </Entries>
</AccessControlList>

새로 생성된 버킷의 기본 객체 ACL이 사전 정의된 projectPrivate ACL과 동일합니다.

ACL 검색

기존 리소스의 ACL을 가져오려면 다음 안내를 따르세요.

콘솔

  1. Google Cloud 콘솔에서 Cloud Storage 브라우저로 이동합니다.
    Cloud Storage 브라우저로 이동

  2. ACL을 조회할 객체로 이동합니다.

  3. 객체의 드롭다운 메뉴에서 액세스 수정을 선택합니다.

    객체의 권한이 표시되는 권한 대화상자가 나타납니다.

Google Cloud 콘솔에서 실패한 Cloud Storage 작업에 대한 자세한 오류 정보를 가져오는 방법은 문제 해결을 참조하세요.

명령줄

  1. objects describe 명령어를 --format 플래그와 함께 사용하여 객체의 ACL을 검색합니다.

    gcloud storage objects describe gs://BUCKET_NAME/OBJECT_NAME --format="default(acl)"

    각 항목의 의미는 다음과 같습니다.

    • BUCKET_NAME은 보려는 ACL이 있는 객체가 포함된 버킷의 이름입니다. 예를 들면 my-bucket입니다.

    • OBJECT_NAME은 보려는 ACL이 있는 객체의 이름입니다. 예를 들면 paris.jpg입니다.

클라이언트 라이브러리

C++

자세한 내용은 Cloud Storage C++ API 참고 문서를 확인하세요.

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

다음 샘플은 객체 ACL을 가져옵니다.

namespace gcs = ::google::cloud::storage;
using ::google::cloud::StatusOr;
[](gcs::Client client, std::string const& bucket_name,
   std::string const& object_name) {
  StatusOr<std::vector<gcs::ObjectAccessControl>> items =
      client.ListObjectAcl(bucket_name, object_name);

  if (!items) throw std::move(items).status();
  std::cout << "ACLs for object=" << object_name << " in bucket "
            << bucket_name << "\n";
  for (gcs::ObjectAccessControl const& acl : *items) {
    std::cout << acl.role() << ":" << acl.entity() << "\n";
  }
}

C#

자세한 내용은 Cloud Storage C# API 참조 문서를 확인하세요.

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

다음 샘플은 객체 ACL을 가져옵니다.


using Google.Apis.Storage.v1.Data;
using Google.Cloud.Storage.V1;
using System;
using System.Collections.Generic;

public class PrintFileAclSample
{
    public IEnumerable<ObjectAccessControl> PrintObjectAcl(
        string bucketName = "your-unique-bucket-name",
        string objectName = "your-object-name")
    {
        var storage = StorageClient.Create();
        var storageObject = storage.GetObject(bucketName, objectName, new GetObjectOptions
        {
            Projection = Projection.Full
        });

        foreach (var acl in storageObject.Acl)
        {
            Console.WriteLine($"{acl.Role}:{acl.Entity}");
        }

        return storageObject.Acl;
    }
}

Go

자세한 내용은 Cloud Storage Go API 참조 문서를 확인하세요.

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

다음 샘플은 객체 ACL을 가져옵니다.

import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/storage"
)

// printFileACL lists ACL of the specified object.
func printFileACL(w io.Writer, bucket, object string) error {
	// bucket := "bucket-name"
	// object := "object-name"
	ctx := context.Background()
	client, err := storage.NewClient(ctx)
	if err != nil {
		return fmt.Errorf("storage.NewClient: %w", err)
	}
	defer client.Close()

	rules, err := client.Bucket(bucket).Object(object).ACL().List(ctx)
	if err != nil {
		return fmt.Errorf("ACLHandle.List: %w", err)
	}
	for _, rule := range rules {
		fmt.Fprintf(w, "ACL rule: %v\n", rule)
	}
	return nil
}

Java

자세한 내용은 Cloud Storage Java API 참조 문서를 확인하세요.

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

다음 샘플은 객체 ACL을 가져옵니다.


import com.google.cloud.storage.Acl;
import com.google.cloud.storage.Blob;
import com.google.cloud.storage.BlobId;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;
import java.util.List;

public class PrintFileAcl {

  public static void printFileAcl(String bucketName, String blobName) {

    // The ID to give your GCS bucket
    // String bucketName = "your-unique-bucket-name";

    // The name of the blob/file that you wish to view Acls of
    // String blobName = "your-blob-name";

    Storage storage = StorageOptions.newBuilder().build().getService();
    Blob blob = storage.get(BlobId.of(bucketName, blobName));
    List<Acl> blobAcls = blob.getAcl();

    for (Acl acl : blobAcls) {

      // This will give you the role.
      // See https://cloud.google.com/storage/docs/access-control/lists#permissions
      String role = acl.getRole().name();

      // This will give you the Entity type (i.e. User, Group, Project etc.)
      // See https://cloud.google.com/storage/docs/access-control/lists#scopes
      String entityType = acl.getEntity().getType().name();

      System.out.printf("%s: %s %n", role, entityType);
    }
  }
}

Node.js

자세한 내용은 Cloud Storage Node.js API 참조 문서를 확인하세요.

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

다음 샘플은 객체 ACL을 가져옵니다.

/**
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// The ID of your GCS bucket
// const bucketName = 'your-unique-bucket-name';

// The ID of your GCS file
// const fileName = 'your-file-name';

// Imports the Google Cloud client library
const {Storage} = require('@google-cloud/storage');

// Creates a client
const storage = new Storage();

async function printFileAcl() {
  // Gets the ACL for the file
  const [acls] = await storage.bucket(bucketName).file(fileName).acl.get();

  acls.forEach(acl => {
    console.log(`${acl.role}: ${acl.entity}`);
  });
}

printFileAcl().catch(console.error);

PHP

자세한 내용은 Cloud Storage PHP API 참조 문서를 확인하세요.

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

다음 샘플은 객체 ACL을 가져옵니다.

use Google\Cloud\Storage\StorageClient;

/**
 * Print all entities and roles for an object's ACL.
 *
 * @param string $bucketName The name of your Cloud Storage bucket.
 *        (e.g. 'my-bucket')
 * @param string $objectName The name of your Cloud Storage object.
 *        (e.g. 'my-object')
 */
function get_object_acl(string $bucketName, string $objectName): void
{
    $storage = new StorageClient();
    $bucket = $storage->bucket($bucketName);
    $object = $bucket->object($objectName);
    $acl = $object->acl();
    foreach ($acl->get() as $item) {
        printf('%s: %s' . PHP_EOL, $item['entity'], $item['role']);
    }
}

Python

자세한 내용은 Cloud Storage Python API 참조 문서를 확인하세요.

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

다음 샘플은 객체 ACL을 가져옵니다.

from google.cloud import storage


def print_blob_acl(bucket_name, blob_name):
    """Prints out a blob's access control list."""

    storage_client = storage.Client()
    bucket = storage_client.bucket(bucket_name)
    blob = bucket.blob(blob_name)

    for entry in blob.acl:
        print(f"{entry['role']}: {entry['entity']}")

Ruby

자세한 내용은 Cloud Storage Ruby API 참조 문서를 확인하세요.

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

다음 샘플은 객체 ACL을 가져옵니다.

# The ID of your GCS bucket
# bucket_name = "your-unique-bucket-name"
# file_name   = "Name of a file in the Storage bucket"
# email       = "Google Cloud Storage ACL Entity email"

require "google/cloud/storage"

storage = Google::Cloud::Storage.new
bucket  = storage.bucket bucket_name
file    = bucket.file file_name

puts "ACL for #{file_name} in #{bucket_name}:"

file.acl.owners.each do |owner|
  puts "OWNER #{owner}"
end

file.acl.readers.each do |reader|
  puts "READER #{reader}"
end

REST API

JSON API

  1. 객체에 대한 OWNER 권한이 있는지 확인합니다.

  2. GET 요청으로 객체의 ACL을 검색합니다.

    객체 ACL은 JSON 형식으로 반환되고 응답의 본문에 첨부됩니다.

예를 들어 example-travel-maps 버킷에서 paris.jpg 객체의 ACL을 반환하려면 다음 안내를 따르세요.

curl -X GET -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    https://storage.googleapis.com/storage/v1/b/example-travel-maps/o/paris.jpg?projection=full

다음과 비슷한 응답이 표시됩니다.

{
  "kind": "storage#object",
  "id": "example-travel-maps/paris.jpg/1412805837131000",
  "selfLink": "https://www.googleapis.com/storage/v1/b/example-travel-maps/o/paris.jpg",
  "name": "paris.jpg",
    "bucket": "example-travel-maps",
  ...
  "acl": [
    {
      ...
      "entity": "project-owners-867489160491",
      "role": "OWNER",
      "projectTeam": {
        "projectNumber": "867489160491",
        "team": "owners"
      },
      ...
    },
    {
      ...
      "entity": "user-jane@gmail.com",
      "role": "OWNER",
      "email": "jane@gmail.com",
      ...
    },
    {
      ...
      "entity": "group-gs-announce@googlegroups.com",
      "role": "READER",
      "email": "gs-announce@googlegroups.com",
      ...
    }
    ],
  "owner": {
    "entity": "user-jane@gmail.com"
  },
  ...
}

objectAccessControls 리소스 GET 메서드를 사용하여 객체의 ACL에 있는 개별 항목을 반환할 수도 있습니다.

XML API

  1. 버킷 또는 객체에 대한 FULL_CONTROL 권한이 있는지 확인합니다.

  2. GET Object 요청에서 acl 쿼리 문자열 매개변수를 사용하여 버킷 또는 객체의 ACL을 검색합니다.

ACL은 XML로 표시되고 응답의 본문에 첨부됩니다.

예를 들어 example-travel-maps 버킷에서 paris.jpg 객체의 ACL을 반환하려면 다음 안내를 따르세요.

curl -X GET -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    https://storage.googleapis.com/example-travel-maps/paris.jpg?acl

다음과 비슷한 응답이 표시됩니다.

<?xml version="1.0" encoding="UTF-8"?>
<AccessControlList>
  <Owner>
    <ID>84fac329bceSAMPLE777d5d22b8SAMPLE77d85ac2SAMPLE2dfcf7c4adf34da46</ID>
    <Name>Owner Name</Name>
  </Owner>
  <Entries>
    <Entry>
      <Scope type="UserById">
        <ID>84fac329bceSAMPLE777d5d22b8SAMPLE77d85ac2SAMPLE2dfcf7c4adf34da46</ID>
        <Name>Name</Name>
      </Scope>
      <Permission>FULL_CONTROL</Permission>
    </Entry>
    <Entry>
      <Scope type="UserByEmail">
        <EmailAddress>jane@gmail.com</EmailAddress>
        <Name>Jane</Name>
      </Scope>
      <Permission>FULL_CONTROL</Permission>
    </Entry>
    <Entry>
      <Scope type="GroupByEmail">
        <EmailAddress>gs-announce@googlegroups.com</EmailAddress>
      </Scope>
      <Permission>READ</Permission>
    </Entry>
  </Entries>
</AccessControlList>

ObjectAccessControls 리소스의 JSON GET 메서드를 사용하여 특정 ACL 항목을 반환할 수도 있습니다.

다음 단계