파트너 포탈 거래 내역 조회 시 권한 불일치로 0건 반환되던 버그 수정
목차
발단
파트너 포탈에서 거래 내역을 조회하는데 결과가 비어 나온다는 제보가 들어옴. 로그 까보니 요청 파라미터에 targetSysId=GLOBAL 이 박혀 있었음. 글로벌 권한 운영자가 쓰던 키를 파트너 계정이 그대로 들고 들어오니 데이터가 0건이 되는 구조였음.
원인
권한 분기가 너무 단순했음. GLOBAL 이 들어오면 무조건 전 시스템 횡단 조회로 빠지는데, 파트너는 횡단 권한이 없어서 결과 집합이 비어버림.
targetSysId=GLOBAL
├─ 운영자 컨텍스트 → 전체 시스템 조회 (정상)
└─ 파트너 컨텍스트 → 권한 밖 → 0건 (버그)
문제는 파라미터가 어떻게 거기 박히느냐였는데, 즐겨찾기 URL, 운영자가 공유해준 링크, 직전 세션 캐시 등 경로가 여러 개라 프런트에서 단속하기 어려웠음.
수정
조회 진입 지점에서 호출 주체부터 판별하고, 파트너 세션이면 GLOBAL 을 본인 소속 sysId 로 치환하는 폴백을 넣음.
- 세션 주체 타입 확인 (운영자/파트너)
- 파트너이고
targetSysId == GLOBAL이면 본인 sysId 로 교체 - 운영자/관리자는 기존 동작 그대로 유지
- 치환 발생 시 감사 로그 한 줄 남김
트레이드오프
| 위치 | 장점 | 단점 |
|---|---|---|
| 프런트 차단 | 구현 간단 | URL 직타·즐겨찾기 우회됨 |
| 서버 폴백 | 모든 진입 커버 | 분기 늘어남 |
처음엔 화면단에서 파라미터를 못 보내게 막을까 했는데, 직접 URL 치고 들어오는 케이스가 있어서 결국 서버에서 받아치는 게 안전함. 프런트는 거들 뿐.
회고
GLOBAL 같은 sentinel 값은 호출자 컨텍스트에 따라 의미가 달라진다는 걸 다시 체감함. 같은 키라도 누가 보냈는지에 따라 해석이 바뀌어야 함. 권한 키를 단순 enum 으로 보면 이런 폴백이 누락되기 쉬움.
또 하나, 0건 응답이 200 OK 로 나가서 모니터링이 못 잡았다는 점. "비었음"과 "권한 때문에 비었음"은 다른데 동일 응답으로 묶이면 사일런트 페일로 흐름.
다음 할 일
- 다른 조회 화면도 동일 패턴 점검 (잔액/정산/원장)
- sentinel 키 폴백 로직을 공통 가드로 추출
- 권한 미스매치 0건 케이스는 별도 메트릭으로 분리
다음
댓글 0
첫 댓글 달아줘.