From 2bcbb3ca77826355f11e0ac9dc6ec0c58d1fd5bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A4=EC=A0=95=EB=AF=BC?= Date: Wed, 22 Jul 2026 11:13:58 +0900 Subject: [PATCH] Add Firestore rules for client address book MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - users/{uid}/addresses 서브컬렉션에 owner 전용 read/delete 및 create/update 규칙 신설 - 필드 화이트리스트(hasOnly)와 타입·길이 검증, updatedAt은 serverTimestamp 강제 - 주문 recipient는 API 인라인 전달이라 서버는 이 컬렉션을 읽지 않음(클라이언트 직접 CRUD) --- firestore.rules | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/firestore.rules b/firestore.rules index 0f90bb4..32d78a2 100644 --- a/firestore.rules +++ b/firestore.rules @@ -37,6 +37,35 @@ service cloud.firestore { allow write: if false; } + // 배송지 주소록 — 본인 전용 클라이언트 직접 CRUD. + // 주문 recipient는 API(POST /reward/orders)에 인라인 전달되므로 + // 서버는 이 컬렉션을 읽지 않는다. 문서 id는 클라이언트 uuid. + match /addresses/{addressId} { + allow read, delete: if request.auth != null && request.auth.uid == uid; + allow create, update: if request.auth != null && request.auth.uid == uid && + request.resource.data.keys().hasOnly([ + 'recipientName', 'phone', 'postalCode', 'address1', 'address2', + 'deliveryMemo', 'isDefault', 'order', 'updatedAt' + ]) && + request.resource.data.recipientName is string && + request.resource.data.recipientName.size() > 0 && + request.resource.data.recipientName.size() <= 50 && + request.resource.data.phone is string && + request.resource.data.phone.size() <= 30 && + request.resource.data.postalCode is string && + request.resource.data.postalCode.size() <= 10 && + request.resource.data.address1 is string && + request.resource.data.address1.size() <= 300 && + request.resource.data.address2 is string && + request.resource.data.address2.size() <= 300 && + request.resource.data.deliveryMemo is string && + request.resource.data.deliveryMemo.size() <= 300 && + request.resource.data.isDefault is bool && + request.resource.data.order is int && + request.resource.data.order >= 0 && + request.resource.data.updatedAt == request.time; + } + // AI 채팅(짹) — 전부 Admin SDK(서버) 전용. 클라이언트가 직접 읽으면 // 프롬프트 노출, 직접 쓰면 한도 우회·이력 위조(영속 인젝션)가 가능해진다. // 이력 조회도 GET /chat/messages 경유. (ai-chat-tech-design.md §4.6)