From e96c0636f5abf0b5394a15e53aa59ee3fe7e18dc Mon Sep 17 00:00:00 2001 From: king Date: Fri, 14 Aug 2026 13:57:40 +0900 Subject: [PATCH] =?UTF-8?q?revert(cafe24):=20=EB=94=94=EC=9E=90=EC=9D=B8?= =?UTF-8?q?=20scope=20=EC=9A=94=EC=B2=AD=20=EC=B2=A0=ED=9A=8C=20=E2=80=94?= =?UTF-8?q?=20=EC=8A=A4=ED=82=A8=20=ED=8C=8C=EC=9D=BC=20API=20=EA=B0=80=20?= =?UTF-8?q?=EC=A1=B4=EC=9E=AC=ED=95=98=EC=A7=80=20=EC=95=8A=EC=9D=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 운영몰에서 직접 확인한 결과(API 버전 2026-03-01): GET /admin/themes/pages → No API found. (엔드포인트 없음) GET /admin/themes → 디자인 권한이 있으면 조회 가능하나 테마 목록뿐, 스킨 파일 내용은 응답에 없음 스킨 HTML 파일(product/detail.html)을 읽거나 쓰는 엔드포인트는 아예 없다. 권한이 아니라 기능이 없는 문제이므로 디자인 scope 를 요청해도 쓸 데가 없다. DEFAULT_SCOPES 를 상품 권한만으로 되돌린다 — 쓰지 않는 권한을 토큰에 담아두면 유출 시 피해 범위만 넓어진다. 아직 재인증하지 않은 상태라(insufficient_scope 로 확인됨) 되돌리는 데 추가 조치가 필요하지 않다. 같은 시도를 반복하지 않도록 확인 사실을 config.py 와 문서에 표로 남겼다. 스크립트 태그(/admin/scripttags)가 유일한 주입 수단이며 mall.write_store 권한과 외부 공개 HTTPS JS 엔드포인트가 필요하다는 점도 함께 적었다. 상단 공통 홍보 숨김은 상품 상세설명 CSS 방식(set_promo_hidden)을 그대로 쓴다. Co-Authored-By: Claude Opus 5 --- app/integrations/cafe24/config.py | 24 ++++++++++++++++++------ docs/CAFE24_MODULE.md | 28 ++++++++++++++++++++++------ 2 files changed, 40 insertions(+), 12 deletions(-) diff --git a/app/integrations/cafe24/config.py b/app/integrations/cafe24/config.py index af50e58..fa6486b 100644 --- a/app/integrations/cafe24/config.py +++ b/app/integrations/cafe24/config.py @@ -13,16 +13,28 @@ from dataclasses import dataclass PRODUCT_SCOPES: tuple[str, ...] = ("mall.read_product", "mall.write_product") ORDER_SCOPES: tuple[str, ...] = ("mall.read_order", "mall.write_order") -# 디자인(테마) — 상단 공통 홍보 숨김을 스킨 쪽에서 처리할 수 있는지 확인/구현용. -# ⚠️ 카페24 Admin API 에는 스킨 HTML 파일(detail.html)을 직접 읽거나 쓰는 -# 엔드포인트가 없다. 조회 가능한 것은 테마 목록과 테마 페이지뿐이다. -# 스크립트 태그 주입은 디자인이 아니라 mall.write_store(상점) 권한이며 -# 인라인 코드가 아닌 외부 HTTPS URL 만 받는다. +# 디자인(테마) — **요청하지 않는다.** 아래 확인 결과 때문이다. +# +# 운영몰에서 직접 호출해 확인한 사실(2026-08-14): +# GET /admin/themes → 조회는 가능(디자인 권한 필요)하지만 테마 "목록"뿐이며 +# 스킨 파일 내용은 응답에 없다. +# GET /admin/themes/pages → No API found. (버전 2026-03-01 에 존재하지 않음) +# 스킨 HTML 파일(product/detail.html 등)을 읽거나 쓰는 엔드포인트는 없다. +# +# 즉 스킨의 `const numbers = [...]`(상단 공통 홍보 제외 목록)을 API 로 고치는 방법은 +# 없다. 상단 공통 홍보 숨김은 상품 상세설명 안 CSS 로 처리한다 +# (app/modules/cafe24/store.py 의 set_promo_hidden). +# +# 페이지에 코드를 주입하는 유일한 수단은 스크립트 태그(/admin/scripttags)이며, +# 디자인이 아니라 **mall.write_store(상점)** 권한이 필요하고 인라인 코드가 아닌 +# 외부 HTTPS URL 만 받는다. 쓰려면 우리 서버에 공개 JS 엔드포인트가 필요하다. DESIGN_SCOPES: tuple[str, ...] = ("mall.read_design", "mall.write_design") +STORE_SCOPES: tuple[str, ...] = ("mall.read_store", "mall.write_store") # 실제로 요청하는 scope 묶음. 개발자센터 앱에 등록된 권한과 어긋나면 인증이 # 거부되므로, 여기에 추가할 때는 앱 권한도 함께 확인해야 한다. -DEFAULT_SCOPES: tuple[str, ...] = PRODUCT_SCOPES + DESIGN_SCOPES +# 쓰지 않는 권한은 요청하지 않는다 — 토큰이 유출돼도 피해 범위를 좁히기 위함. +DEFAULT_SCOPES: tuple[str, ...] = PRODUCT_SCOPES DEFAULT_API_VERSION = "2026-03-01" diff --git a/docs/CAFE24_MODULE.md b/docs/CAFE24_MODULE.md index 4edf19f..371e733 100644 --- a/docs/CAFE24_MODULE.md +++ b/docs/CAFE24_MODULE.md @@ -204,9 +204,23 @@ cafe24_oauth_tokens 저장 const numbers = [12,31,32, ...]; // .edb-img-tag-w 를 remove() ``` -**카페24 Admin API 로는 이 파일을 고칠 수 없다.** 확인 결과 스킨/테마는 조회만 -가능하고(`GET /admin/themes`), 스킨 HTML 파일을 읽거나 쓰는 엔드포인트가 없다. -쓸 수 있는 것은 테마 페이지와 스크립트 태그(`/admin/scripttags`)뿐이다. +**카페24 Admin API 로는 이 파일을 고칠 수 없다.** 운영몰에서 직접 호출해 확인했다 +(2026-08-14, API 버전 2026-03-01). + +| 호출 | 결과 | +| --- | --- | +| `GET /admin/themes` | 디자인 권한이 있으면 조회 가능하나 **테마 목록뿐** — 파일 내용 없음 | +| `GET /admin/themes/pages` | **`No API found.`** — 이 버전에 존재하지 않는다 | +| 스킨 파일(`product/detail.html`) 읽기/쓰기 | **엔드포인트 자체가 없다** | + +권한 문제가 아니라 기능이 없는 것이므로, 디자인 권한을 추가해도 달라지지 않는다. +그래서 `DEFAULT_SCOPES` 에 디자인 scope 를 **넣지 않는다**(쓰지 않는 권한은 요청하지 +않는다 — `app/integrations/cafe24/config.py` 주석 참고). + +페이지에 코드를 주입하는 유일한 수단은 스크립트 태그(`/admin/scripttags`)인데, +디자인이 아니라 **`mall.write_store`(상점)** 권한이며 **인라인 코드가 아닌 외부 HTTPS +URL** 만 받는다. 쓰려면 우리 서버에 공개 JS 엔드포인트를 두고 쇼핑몰이 그것을 불러가게 +해야 한다. 그래서 같은 결과를 **상품 상세설명 안의 CSS** 로 낸다. 상세설명은 우리가 쓸 수 있고, 상품별로 켜고 끌 수 있으며, 상태가 그 상품 소스에 그대로 보인다. @@ -226,9 +240,11 @@ const numbers = [12,31,32, ...]; // .edb-img-tag-w 를 remove() - 스킨의 `numbers` 목록과는 독립이다. 이미 목록에 있는 상품은 그대로 두면 된다 (스킨은 요소를 제거하고, 이쪽은 CSS 로 숨긴다 — 결과는 같고 충돌하지 않는다). -> 스킨의 `numbers` 방식을 그대로 자동화하려면 `/admin/scripttags` 로 전역 스크립트를 -> 주입하는 방법이 있다. 다만 **디자인 쓰기 권한 추가 + 재인증**이 필요하고, 상품별 -> 상태가 한 곳에 몰려 관리가 어려워진다. 지금은 채택하지 않았다. +> 스킨의 `numbers` 방식(요소 제거 + 목록 한 곳 관리)을 자동화하려면 `/admin/scripttags` +> 로 전역 스크립트를 주입하는 방법뿐이다. 필요한 것: **`mall.write_store` 권한 추가 + +> 재인증**, 그리고 **우리 서버의 공개 HTTPS JS 엔드포인트**(쇼핑몰 방문자 브라우저가 +> 직접 불러가므로 인증을 걸 수 없다). 쇼핑몰이 우리 서버 가용성에 의존하게 되는 것도 +> 감안해야 한다. 지금은 채택하지 않았다. ---