OPA (Open Policy Agent)

정책 코드 분리 엔진

OPA(Open Policy Agent)는 정책을 애플리케이션 코드에서 분리해서 Rego 언어로 관리하는 범용 정책 엔진. 서비스가 JSON으로 질의하면 allow/deny를 반환한다. K8s, API 인가, IaC 검증 등에 쓰인다.

RBAC

개념

OPA는 정책을 애플리케이션 밖으로 빼내는 범용 정책 엔진이다. 서비스가 JSON으로 "이 요청 허용해도 돼?"를 물어보면, OPA가 Rego 언어로 작성된 정책을 평가해서 allow/deny를 돌려준다. CNCF 졸업 프로젝트.

RBAC이나 ABAC 같은 권한 모델과는 축이 다르다. OPA는 "정책을 어디서 어떻게 평가할 것인가"의 실행 엔진이고, Rego 안에 RBAC든 ABAC든 자유롭게 작성할 수 있다.

왜 필요한가

앱 코드 안에 if user.role == "admin" 같은 권한 체크를 직접 박으면 세 가지 문제가 생긴다.

  • 정책이 흩어짐 — 서비스마다 권한 로직이 복사되고, 변경하려면 여러 저장소를 건드려야 함
  • 재배포 필요 — 정책 한 줄 바꾸려고 서비스 전체 재배포
  • 감사 불가 — "이 요청은 왜 허용됐지?"를 코드 뒤져서 추적

OPA는 정책을 별도 엔진으로 빼서 이 셋을 해결한다. 서비스는 "질의만" 하고 정책 파일은 OPA만 갱신하면 된다.

동작 방식

서비스 → JSON 질의 → OPA → Rego 정책 평가 → allow/deny 반환
  1. 서비스가 OPA에 JSON으로 입력을 넘김 (사용자 정보, 요청 메서드·경로 등)
  2. OPA가 Rego 정책 + 외부 데이터(data.json 같은 기준 데이터)로 평가
  3. 구조화된 결과({"allow": true})를 반환

외부 데이터는 정책과 별도로 OPA에 올려두는 기준 데이터다. 역할 매핑, 허용 IP 목록 같은 게 여기 들어간다. 정책이 코드고 외부 데이터가 설정이라고 보면 된다.

Rego 최소 개념

Rego는 선언형 언어라서 "허용 조건만" 나열한다. 처음 보면 낯선 두 가지 규칙이 핵심이다.

  • default allow = falseallow가 어떤 규칙에도 안 걸리면 undefined가 되므로 기본값을 명시해야 안전하다
  • 같은 이름의 블록 여러 개 = ORallow { ... }를 여러 번 쓰면 어느 하나라도 통과하면 true

API 접근 제어 예시

package api.authz

default allow = false

# admin은 전부 허용
allow {
    input.user.role == "admin"
}

# 일반 사용자는 자기 데이터만
allow {
    input.method == "GET"
    input.path == ["users", input.user.id]
}
  • 블록 안의 여러 줄은 AND (전부 참이어야 통과)
  • allow 블록은 OR (둘 중 하나만 통과해도 true)
  • input.path가 배열인 건 Rego가 URL 경로를 /로 분해해서 넘기기 때문

질의 입력

{
  "input": {
    "user": { "id": "user123", "role": "member" },
    "method": "GET",
    "path": ["users", "user123"]
  }
}

→ 두 번째 allow 블록이 통과해서 allow: true (자기 데이터 조회).

앱 내 권한 체크 vs OPA

OPA의 비교 대상은 RBAC이 아니라 **"코드 안에 직접 박힌 권한 체크"**다.

코드 내 체크 OPA
정책 위치 각 서비스 코드 별도 엔진
변경 시 재배포 서비스 전체 OPA만
일관성 서비스마다 제각각 한 곳에서 강제
감사 코드 추적 정책 파일 + 로그
복잡도 단순 학습 + 운영 필요

어디에 쓰나

사용처 도구 하는 일
Kubernetes Gatekeeper 리소스 배포 정책 검사 (privileged 컨테이너 차단 등)
API 인가 Envoy + OPA 마이크로서비스 요청 권한 검증
IaC 검증 Conftest Terraform/K8s 매니페스트가 보안 정책 지키는지 확인
CI/CD 파이프라인 게이트 배포 전 정책 위반 검사

공통 이유: **"정책을 앱 밖에서 통일 관리해야 하는 자리"**라서 OPA가 적합.

언제 안 쓰나

  • 단순 role 기반이면 그냥 RBAC로 충분. OPA는 오버엔지니어링
  • 앱이 작고 서비스가 하나면 정책 분리의 이득 < 운영 복잡도
  • 팀이 Rego를 배울 여력이 없을 때

더 보기

sunshinemoon · 2026