단일 값 vs 다중 값 컨텍스트 키
단일 값 vs 다중 값 컨텍스트 키
조건 키가 요청에서 단일 값을 가지는지 여러 값을 가지는지에 따라 AWS가 조건을 평가하는 방식이 달라져요. 이 페이지는 두 경우의 평가 논리 차이를 설명해요.
출처: 문서
본문
정책 조건에서 컨텍스트 키가 단일 값을 가지는지(단일 값 컨텍스트 키) 여러 값을 가지는지(다중 값 컨텍스트 키)는 조건 평가에 중요해요.
단일 값 컨텍스트 키
대부분의 컨텍스트 키는 요청 컨텍스트에서 단일 값을 가져요. 예를 들어 aws:SourceIp는 요청이 시작된 IP 주소 하나를, aws:username은 사용자 이름 하나를 나타내요.
단일 값 키를 검사할 때는 단순 비교 연산자(StringEquals, NumericLessThan 등)를 사용하면 돼요. 조건 키 값과 정책의 값을 직접 비교해요.
다중 값 컨텍스트 키
일부 컨텍스트 키는 여러 값을 가질 수 있어요. 예를 들어 aws:TagKeys는 요청에 포함된 모든 태그 키를, s3:prefix는 특정 요청에서 여러 접두사를 나타낼 수 있어요. dynamodb:Attributes도 요청에 나열된 여러 속성을 나타내요.
다중 값 키를 검사할 때는 집합 연산자(set operators)를 사용해 평가 방식을 명시하는 게 필요해요.
- ForAllValues — 요청의 모든 값이 정책의 값 중 하나와 매칭되어야 해요.
- ForAnyValue — 요청의 값 중 하나 이상이 정책의 값과 매칭되어야 해요.
집합 연산자 없이 다중 값 키를 사용하면, 훨씬 보수적인(또는 예상치 못한) 기본 동작이 적용돼요. 정책 작성 시 다중 값 키에는 의도한 의미로 ForAllValues 또는 ForAnyValue를 명시하는 것이 안전해요.
예시 비교
aws:TagKeys가 요청에 environment와 costcenter 두 값을 가진 경우를 생각해 볼게요.
ForAnyValue를 쓰면 값 중 하나라도 매칭되면 조건이 참이에요.
"Condition": {
"ForAnyValue:StringEquals": {
"aws:TagKeys": "environment"
}
}
이 경우 요청에 environment가 있으므로 참이에요.
ForAllValues를 쓰면 모든 값이 매칭되어야 해요.
"Condition": {
"ForAllValues:StringLike": {
"aws:TagKeys": ["environment", "costcenter*"]
}
}
environment는 environment와, costcenter는 costcenter*와 매칭되므로 두 값 모두 매칭돼 참이에요.
집합 연산자에 대한 자세한 내용은 다중 값 컨텍스트 키용 집합 연산자를 참고하세요.