퇴사하거나 부서를 옮긴 사람의 권한이 남는 문제를, 지연을 0으로 만드는 대신 지연을 인정하고 추적 가능하게 만드는 쪽으로 푼 이야기다. HR 시스템이 쥔 관계 데이터와 인가 엔진 사이의 동기화 지연이 원인이며, ReBAC 과 기존 CDC 파이프라인 재활용으로 대응한다.
핵심 포인트- 문제는 권한 설계가 아니라 원천(HR·조직)과 판정 엔진 사이의 동기화 지연이다
- 역할 목록 대신 관계로 인가를 표현하는 ReBAC 을 택하고 OpenFGA 로 튜플을 관리한다
- 새 메시징을 만들지 않고 기존 Outbox → CDC/Debezium → Kafka 파이프라인에 인가 컨슈머를 붙였다
- 지연을 방향별로 나눠 본다 — 권한이 더 남는 쪽은 보안 위험, 늦게 오는 쪽은 업무 불편으로 등급이 다르다
- 캐시는 무효화 신호를 믿는 대신 이 답이 변경보다 최신인지를 매번 확인하는 방식으로 바꿨다
상세 정리- 사고 시나리오: 마케팅에서 개발로 옮긴 팀장이 옛 매니저 권한으로 마케팅 급여를 계속 볼 수 있는 상황이다
- 원천 분산: 조직·구성원·HR·프로젝트 등 도메인 서비스가 각자 관계 데이터를 소유한다
- 판정 분리: 인가 엔진은 그 관계를 튜플로 받아 저장하고 질의에 답하는 역할만 맡는다
- 번역 계층: 인가 컨슈머가 구성원 배정됨 같은 도메인 이벤트를 어떤 관계가 생기고 사라졌는지로 옮긴다
- 지연 관리: 허용 방향 불일치와 제한 방향 불일치를 구분해 데이터 민감도별로 감내 수준을 정하고 초·분 단위로 모니터링한다
- 부분 실패: 조직 개편이면 수백 개 튜플이 한 번에 바뀌는데 일부만 성공하면 옛 권한이 남는다
- 재시도 전략: 네트워크 장애 같은 단기 실패는 재시도로 흡수하고, 지속 실패용 재처리 경로는 개발 중이다
- 재처리 안전성: 관계 갱신이 기존 튜플과 비교해 차이분만 처리하므로 같은 이벤트를 다시 흘려도 안전하다
- 캐시 3단: 변경 직후에는 캐시를 우회하고, 안정 구간에서는 캐시를 쓰며, 급여처럼 민감한 데이터는 아예 캐시를 쓰지 않는다
- 사후 추적: 완벽한 실시간 동기화를 포기한 대가로 튜플 생성·삭제를 시간순으로 남겨, 특정 시점에 누가 무엇에 접근 가능했는지 되짚을 수 있게 했다
- 남은 과제: 감사 로그 영속화와 지속 실패 재처리 경로가 다음 작업이다
왜 읽나인가를 HR·조직 데이터와 연동해야 하는 팀에게, 동기화 지연을 없애려 애쓰는 대신 등급을 나눠 관리하는 현실적 설계를 보여준다.