오늘은 Deploy-gate의 핵심 기능 중 하나인 Claims 기반 인가를 살펴보았다.
먼저 인증(Authentication)과 인가(Authorization)의 차이를 다시 정리했다.
인증(Authentication)
→ "너 누구야?"
인가(Authorization)
→ "네가 이 작업을 할 수 있어?"
Deploy-gate에서 중요한 것은 두 번째인 인가다.
Deployer Entity를 살펴보면 사용자 이름과 여러 개의 Claim을 가지고 있다.
@ElementCollection(fetch = FetchType.EAGER)
private Set<String> claims = new HashSet<>();
Claim은 문자열 형태로 관리되며, 프로젝트에서는 Stack과 행동을 조합해 권한을 표현한다.
예를 들어,
stack:SmallAppStack:deploy
stack:ProdAlbStack:deploy
stack:ProdAlbStack:approve
와 같이 표현할 수 있다.
이를 통해 단순히 "배포자"라는 역할만 부여하는 것이 아니라,
어떤 Stack에
어떤 작업을
할 수 있는가
를 구체적으로 표현할 수 있다.
StackPolicy에는 다음과 같은 값이 존재한다.
stackName
requiredClaim
approvalLevel
예를 들어,
stackName = SmallAppStack
requiredClaim = stack:SmallAppStack:deploy
approvalLevel = NONE
이라면 해당 사용자가 stack:SmallAppStack:deploy Claim을 가지고 있는지를 확인하게 된다.
이번 코드를 통해 권한을 단순한 Role이 아니라 작업 단위의 Claim으로 세분화할 수 있다는 것을 이해했다.
특히 배포 권한과 승인 권한을 별도의 Claim으로 관리하는 구조가 이후 승인 시스템과 연결된다는 점도 확인했다.