이 문서는 컨테이너 정책을 사용해 NHN Cloud 오브젝트 스토리지의 컨테이너 관련 설정을 관리하는 방법을 설명합니다.
컨테이너 정책을 사용하면 컨테이너 설정을 JSON 형식의 정책 문서로 통합하여 관리할 수 있습니다.
정책 문서는 다음과 같이 기능별 최상위 키로 구성되며, 각 최상위 키 하위에 세부 설정을 정의합니다.
{
"lifecycle": { ... },
"acl": { ... },
"ip_acl": { ... },
"cors": { ... },
"lock": { ... }
}
각 최상위 키가 담당하는 기능은 다음과 같습니다.
| 최상위 키 | 기능 | 설명 |
|---|---|---|
lifecycle |
수명 주기 | 오브젝트의 수명 주기 규칙을 설정합니다. |
acl |
접근 제어(ACL) | 컨테이너의 읽기, 쓰기, 조회 접근 권한을 설정합니다. |
ip_acl |
IP 접근 제어(IP ACL) | IP 기반 접근 제어를 설정합니다. |
cors |
교차 출처 리소스 공유(CORS) | 허용 출처 등 CORS 설정을 관리합니다. |
lock |
오브젝트 잠금 | 오브젝트 잠금(WORM)의 잠금 주기를 설정합니다. |
컨테이너에 설정된 정책 문서를 조회합니다.
GET /v1/{Account}/{Container}?policy
X-Auth-Token: {token-id}
| 이름 | 종류 | 형식 | 필수 | 설명 |
|---|---|---|---|---|
| X-Auth-Token | Header | String | Y | 토큰 ID |
| Account | URL | String | Y | 스토리지 계정 |
| Container | URL | String | Y | 컨테이너 이름 |
| policy | Query | String | Y | 정책 조회를 위한 쿼리 파라미터 값을 지정하지 않으면 전체 정책 문서를, 기능별 최상위 키를 지정하면 해당 기능의 정책만 조회합니다. |
성공 시 HTTP 상태 코드 200과 함께 JSON 형식의 정책 문서를 반환합니다. 설정된 정책이 없으면 빈 JSON 오브젝트를 반환합니다.
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
policy 쿼리 파라미터에 값을 지정하지 않으면 설정된 모든 기능의 정책을 하나의 문서로 반환합니다.
GET /v1/{Account}/{Container}?policy
X-Auth-Token: {token-id}
{
"lifecycle": {
"default_rule": { "days": 10, "action": { "type": "delete" } },
"rules": [
{
"name": "rule1",
"condition": { "prefix": "logs/" },
"days": 5,
"action": { "type": "transfer", "destination": "archive-container" }
}
]
},
"acl": {
"read": { "public": true, "grantees": [ { "tenant": "project-a", "user": "user-1" } ] }
},
"ip_acl": {
"whitelist": [ { "permission": "read", "cidr": "10.0.0.0/24" } ],
"services": [ { "name": "service_gateway", "permission": "read" } ]
},
"cors": {
"allow_origins": [ "https://example.com" ],
"max_age": 3600,
"expose_headers": [ "ETag" ]
},
"lock": { "days": 30 }
}
policy 쿼리 파라미터에 값을 지정하면 해당 기능의 정책만 반환합니다. 설정되지 않은 기능은 응답에 포함되지 않습니다.
GET /v1/{Account}/{Container}?policy=acl
X-Auth-Token: {token-id}
{
"acl": {
"read": {
"public": true,
"grantees": [ { "tenant": "project-a", "user": "user-1" } ]
}
}
}
요청 본문에 JSON 정책 문서를 포함해 컨테이너 정책을 설정합니다.
정책을 설정할 때 다음 규칙이 적용됩니다.
lifecycle, acl, ip_acl, cors, lock만 사용할 수 있으며, 스키마에 정의되지 않은 키나 필드를 포함하면 요청이 거부됩니다.POST /v1/{Account}/{Container}
X-Auth-Token: {token-id}
Content-Type: application/json
| 이름 | 종류 | 형식 | 필수 | 설명 |
|---|---|---|---|---|
| X-Auth-Token | Header | String | Y | 토큰 ID |
| Content-Type | Header | String | Y | application/json |
| Account | URL | String | Y | 스토리지 계정 |
| Container | URL | String | Y | 컨테이너 이름 |
| - | Body | JSON | Y | 설정할 정책 문서 |
성공 시 HTTP 상태 코드 204를 반환합니다. 응답 본문은 없습니다.
알아두기
같은 요청에서 헤더와 정책 문서를 함께 사용하면 정책 문서가 우선 적용됩니다.
정책 문서가 스키마에 맞지 않으면 HTTP 상태 코드 400과 함께 오류 위치와 사유를 담은 메시지를 반환합니다.
컨테이너 정책 문서의 lifecycle 키를 사용해 수명 주기 규칙을 설정합니다.
수명 주기에는 두 가지 종류의 규칙이 있습니다.
| 규칙 종류 | 이름 | 설명 |
|---|---|---|
default_rule |
기본 규칙 | 모든 조건 규칙에 부합하지 않는 오브젝트에 적용되는 규칙입니다. |
rules |
조건 규칙 | 설정한 조건에 부합하는 오브젝트에 적용되는 규칙입니다. 기본 규칙보다 우선 적용됩니다. |
수명 주기 정책 문서의 구조는 다음과 같습니다.
{
"lifecycle": {
"default_rule": {
"days": integer,
"action": {
"type": "transfer" | "delete",
"destination": string
}
},
"rules": [
{
"name": string,
"condition": {
"prefix": string
},
"days": integer,
"action": {
"type": "transfer" | "delete",
"destination": string
}
}
]
}
}
| 필드 | 형식 | 필수 | 설명 | 비고 |
|---|---|---|---|---|
default_rule |
Object | N | 기본 규칙 | |
default_rule.days |
Integer | Y | 오브젝트 수명 주기 | 일 단위, 최대 36,500일 |
default_rule.action.type |
Enum | Y | 만료 동작 유형 | "transfer" (이동) 또는 "delete" (삭제) |
default_rule.action.destination |
String | Conditional | 만료 시 오브젝트를 이동할 대상 컨테이너 이름 | type이 "transfer"일 때 필수 |
rules |
Array | N | 조건 규칙 목록 | 최대 30개 |
rules[*].name |
String | Y | 규칙 이름 | 컨테이너 내에서 중복될 수 없습니다. |
rules[*].condition.prefix |
String | Y | 오브젝트 이름의 접두사 조건 | 빈 문자열은 허용하지 않습니다. |
rules[*].days |
Integer | Y | 오브젝트 수명 주기 | 일 단위, 최대 36,500일 |
rules[*].action.type |
Enum | Y | 만료 동작 유형 | "transfer" (이동) 또는 "delete" (삭제) |
rules[*].action.destination |
String | Conditional | 만료 시 오브젝트를 이동할 대상 컨테이너 이름 | type이 "transfer"일 때 필수 |
오브젝트 하나에는 단 하나의 수명 주기 규칙만 적용됩니다. 규칙은 아래 우선순위에 따라 적용됩니다.
| 우선순위 | 규칙 | 설명 |
|---|---|---|
| 1 | 조건 규칙 (rules) |
조건 규칙의 순서대로 확인하여 처음으로 부합하는 규칙을 적용합니다. |
| 2 | 기본 규칙 (default_rule) |
부합하는 조건 규칙이 없으면 기본 규칙을 적용합니다. |
| 3 | 삭제 | 오브젝트 만료 시 적용할 수 있는 규칙이 없으면 삭제됩니다. |
수명 주기는 오브젝트 업로드 시점에 컨테이너의 정책을 조회하여 적용합니다.
days) 값을 기반으로 오브젝트 만료 일시를 설정합니다.만료 동작은 오브젝트 만료 시점에 컨테이너의 정책을 조회하여 적용합니다.
action)에 따라 이동(transfer) 또는 삭제(delete)를 수행합니다.아래와 같은 수명 주기 규칙이 설정되어 있다고 가정합니다.
{
"lifecycle": {
"default_rule": {
"days": 10,
"action": { "type": "delete" }
},
"rules": [
{
"name": "rule1",
"condition": { "prefix": "logs/" },
"days": 5,
"action": { "type": "transfer", "destination": "archive-container" }
}
]
}
}
image/test.jpg 업로드logs/ 접두사 조건에 부합하지 않으므로 기본 규칙 적용rule1의 조건 변경"condition": { "prefix": "image/" }로 변경image/test.jpg 수명 주기 만료rule1의 image/ 접두사 조건에 부합archive-container로 이동컨테이너 정책 문서의 acl 키를 사용해 컨테이너 접근 권한을 설정합니다. 접근 제어는 읽기, 쓰기, 조회 세 가지 권한으로 구성됩니다.
| 권한 | 키 | 설명 |
|---|---|---|
| 읽기 | read |
컨테이너 정보와 오브젝트 정보 조회 및 다운로드를 허용합니다. |
| 쓰기 | write |
오브젝트 업로드, 삭제 등 변경 요청을 허용합니다. |
| 조회 | view |
컨테이너의 오브젝트 목록 조회를 허용합니다. |
정책 문서의 read, write, view는 각각 컨테이너의 X-Container-Read, X-Container-Write, X-Container-View 속성에 대응합니다. 각 권한의 자세한 내용은 접근 정책 설정 가이드를 참고합니다.
접근 제어 정책 문서의 구조는 다음과 같습니다.
{
"acl": {
"read": {
"public": boolean,
"listing": boolean,
"referrers": {
"allow": [ string ],
"deny": [ string ]
},
"grantees": [
{ "tenant": string, "user": string }
]
},
"write": {
"grantees": [
{ "tenant": string, "user": string }
]
},
"view": {
"grantees": [
{ "tenant": string, "user": string }
]
}
}
}
| 필드 | 형식 | 필수 | 설명 | 비고 |
|---|---|---|---|---|
read |
Object | N | 읽기 권한 | grantees, referrers(allow, deny), public, listing을 합산하여 최대 100개 |
read.public |
Boolean | N | 모든 사용자에게 읽기 허용 | .r:* 정책 요소에 대응하며, 인증 토큰 없이 접근을 허용합니다. |
read.listing |
Boolean | N | 오브젝트 목록 조회 허용 | .rlistings 정책 요소에 대응하며, 읽기 권한이 있는 사용자에게 목록 조회를 허용합니다. 단독으로는 설정할 수 없습니다. |
read.referrers.allow |
Array | N | 접근을 허용할 리퍼러(HTTP Referer) 도메인 목록 | 각 항목은 .r:<referrer> 정책 요소에 대응합니다. 빈 문자열이나 와일드카드 *는 허용하지 않으며, ,를 포함하거나 -로 시작할 수 없습니다. |
read.referrers.deny |
Array | N | 접근을 차단할 리퍼러(HTTP Referer) 도메인 목록 | 각 항목은 .r:-<referrer> 정책 요소에 대응합니다. 빈 문자열이나 와일드카드 *는 허용하지 않으며, ,를 포함하거나 -로 시작할 수 없습니다. |
read.grantees |
Array | N | 읽기 권한을 부여할 사용자 목록 | <tenant>:<user> 형식의 역할 기반 접근 정책 요소에 대응합니다. |
read.grantees[*].tenant |
String | Y | 테넌트(프로젝트) ID | 와일드카드 *를 사용할 수 있습니다. 빈 문자열은 허용하지 않으며, 값에 ,나 :를 포함할 수 없습니다. |
read.grantees[*].user |
String | Y | API 사용자 ID | 와일드카드 *를 사용할 수 있습니다. 빈 문자열은 허용하지 않으며, 값에 ,를 포함할 수 없습니다. |
write |
Object | N | 쓰기 권한 | grantees 최대 100개 |
write.grantees |
Array | N | 쓰기 권한을 부여할 사용자 목록 | grantees 형식은 read.grantees와 동일합니다. |
view |
Object | N | 조회 권한 | grantees 최대 100개 |
view.grantees |
Array | N | 조회 권한을 부여할 사용자 목록 | grantees 형식은 read.grantees와 동일합니다. |
알아두기
public, listing, referrers에 대응하는 요소는 접근 정책 설정 가이드의 기타 접근 정책 요소를, grantees에 대응하는 요소는 역할 기반 접근 정책 요소를 참고합니다.
{
"acl": {
"read": {
"public": true,
"listing": true,
"grantees": [ { "tenant": "project-a", "user": "user-1" } ]
},
"write": {
"grantees": [ { "tenant": "project-a", "user": "user-1" } ]
}
}
}
view를 포함하지 않았으므로 조회 권한은 해제됩니다.
컨테이너 정책 문서의 ip_acl 키를 사용해 IP 기반 접근 제어를 설정합니다. 화이트리스트와 블랙리스트는 동시에 사용할 수 없으며, 둘 다 설정하면 화이트리스트만 적용됩니다. 그 외 동작 방식은 접근 정책 설정 가이드의 IP 기반 접근 정책을 참고합니다.
IP 접근 제어 정책 문서의 구조는 다음과 같습니다.
{
"ip_acl": {
"whitelist": [
{ "permission": "read" | "write" | "full_control", "cidr": string }
],
"blacklist": [
{ "permission": "read" | "write" | "full_control", "cidr": string }
],
"services": [
{ "name": "service_gateway", "permission": "read" | "write" | "full_control" | "deny" }
]
}
}
| 필드 | 형식 | 필수 | 설명 | 비고 |
|---|---|---|---|---|
whitelist |
Array | N | 접근을 허용할 IP 목록 | 최대 100개 |
whitelist[*].permission |
Enum | Y | 규칙을 적용할 작업 유형 | "read", "write", "full_control" |
whitelist[*].cidr |
String | Y | IPv4 주소 또는 CIDR | 빈 문자열은 허용하지 않습니다. |
blacklist |
Array | N | 접근을 차단할 IP 목록 | 최대 100개 |
blacklist[*].permission |
Enum | Y | 규칙을 적용할 작업 유형 | "read", "write", "full_control" |
blacklist[*].cidr |
String | Y | IPv4 주소 또는 CIDR | 빈 문자열은 허용하지 않습니다. |
services |
Array | N | 서비스별 접근 제어 | |
services[*].name |
Enum | Y | 서비스 이름 | 현재 service_gateway만 지원합니다. |
services[*].permission |
Enum | Y | 허용하거나 차단할 작업 유형 | "read", "write", "full_control", "deny" |
알아두기
cidr에는 IPv4 주소 또는 CIDR을 입력합니다. IP 기반 접근 정책은 IPv4만 지원합니다.
{
"ip_acl": {
"whitelist": [
{ "permission": "read", "cidr": "10.0.0.0/24" },
{ "permission": "full_control", "cidr": "192.168.0.1" }
],
"services": [
{ "name": "service_gateway", "permission": "read" }
]
}
}
컨테이너 정책 문서의 cors 키를 사용해 교차 출처 리소스 공유(CORS)를 설정합니다. CORS 설정과 허용 출처 형식의 자세한 내용은 API 가이드의 교차 출처 리소스 공유(CORS)를 참고합니다.
CORS 정책 문서의 구조는 다음과 같습니다.
{
"cors": {
"allow_origins": [ string ],
"max_age": integer,
"expose_headers": [ string ]
}
}
| 필드 | 형식 | 필수 | 설명 | 비고 |
|---|---|---|---|---|
allow_origins |
Array | N | 허용할 출처(Origin) 목록 | 최대 100개 각 항목에 공백을 포함할 수 없습니다. |
max_age |
Integer | N | 프리플라이트 응답 캐시 시간 | 초 단위, 0 이상의 정수 |
expose_headers |
Array | N | 브라우저에 노출할 응답 헤더 목록 | 최대 100개 각 항목에 공백을 포함할 수 없습니다. |
{
"cors": {
"allow_origins": [ "https://example.com", "https://app.example.com" ],
"max_age": 3600,
"expose_headers": [ "ETag", "X-Timestamp" ]
}
}
컨테이너 정책 문서의 lock 키를 사용해 오브젝트 잠금(WORM, Write-Once-Read-Many)의 잠금 주기를 설정합니다. 오브젝트 잠금의 개념과 제약은 API 가이드의 오브젝트 잠금 기간 변경을 참고합니다.
오브젝트 잠금 정책 문서의 구조는 다음과 같습니다.
{
"lock": {
"days": integer
}
}
| 필드 | 형식 | 필수 | 설명 | 비고 |
|---|---|---|---|---|
days |
Integer | Y | 오브젝트 잠금 주기 | 일 단위, 0~36,500일(최대 100년) |
오브젝트 잠금은 설정할 때 다음 사항에 유의해야 합니다.
lock을 설정하는 요청은 거부됩니다.days를 0으로 설정하면 기본 잠금 주기가 0일이 될 뿐, 오브젝트 잠금은 활성 상태로 유지됩니다.{
"lock": {
"days": 30
}
}