feat: P6 모바일 PWA 보안 강화 — /api/mobile/me/* 서버측 본인 필터
스캐폴드의 클라이언트 agentId 쿼리 필터(변조 가능)를
서버측 강제 필터로 교체. 토큰 → user → agentId 자동 추출.
백엔드 (ga-api):
- MobileMeService — 클라이언트 param 의 agentId/userId 는 무시·덮어쓰기.
agentId 미연결 시 BizException(FORBIDDEN). PageHelper 로 정확한 total 산출.
- MobileMeController — GET /api/mobile/me/{summary,statements,
withdraw-requests,notifications} + POST /notifications/{id}/read.
별도 메뉴 권한 없이 인증만 통과 (PWA 사용자 전체 대상).
ga-mobile-pwa:
- api/statement.ts, api/withdraw.ts → /api/mobile/me/* 호출, agentId 제거
- api/notification.ts 신규 — list/markRead/summary
- Home.tsx — summary() 단일 호출로 3카운트 + 안 읽음 Badge
- NoticeList.tsx — Tabs(내 알림 / 공지). 알림 클릭 markRead + summary 무효화
- Statement/WithdrawList — E403(설계사 미연결) 시 ErrorBlock 안내
라이브 검증:
- ga-api 컴파일 BUILD SUCCESSFUL · 재기동 OK
- PWA tsc PASS · vite build PASS (precache 538KB, gzip 176KB)
- admin(agentId=null): /summary → 200 OK 0/0/0,
/statements → E403 차단 정상, /notifications → 200 OK total=0
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -16,7 +16,6 @@ export interface StatementResp extends Record<string, unknown> {
|
||||
}
|
||||
|
||||
export interface StatementSearchParam {
|
||||
agentId?: number;
|
||||
settleMonth?: string;
|
||||
statementType?: string;
|
||||
issueStatus?: string;
|
||||
@@ -25,8 +24,7 @@ export interface StatementSearchParam {
|
||||
}
|
||||
|
||||
export const statementApi = {
|
||||
/** 본인 명세서 — 서버측이 토큰 → agentId 강제 필터. */
|
||||
list: (params: StatementSearchParam = {}) =>
|
||||
unwrap<PageResponse<StatementResp>>(api.get('/api/statements', { params })),
|
||||
detail: (id: number) =>
|
||||
unwrap<StatementResp>(api.get(`/api/statements/${id}`)),
|
||||
unwrap<PageResponse<StatementResp>>(api.get('/api/mobile/me/statements', { params })),
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user