diff --git a/app/api/documents.py b/app/api/documents.py index a59e10d..261781e 100644 --- a/app/api/documents.py +++ b/app/api/documents.py @@ -675,14 +675,26 @@ async def get_document_file( async def get_document_image_raw( doc_id: int, image_key: str, - user: Annotated[User, Depends(get_current_user)], session: Annotated[AsyncSession, Depends(get_session)], + token: str | None = Query(None, description="Bearer token (img 태그용)"), ): """marker 추출 이미지 raw bytes (Phase 1B.5). md_content 안의 `![alt](docimg:img_NNN)` ref 를 frontend selector 가 이 라우트로 변환. - 인증된 사용자만 응답 (단일 사용자 환경, ownership 컬럼 없음 — get_current_user 게이트 충분). + 인증된 사용자만 응답 (단일 사용자 환경, ownership 컬럼 없음). + + 인증: `` 는 Authorization header 를 못 보내므로 `?token=` 쿼리 파라미터 + 로 access token 을 전달 — 기존 `/{doc_id}/file?token=` 엔드포인트 (iframe 용) 와 + 동일 패턴. """ + from core.auth import decode_token + + if not token: + raise HTTPException(status_code=401, detail="토큰이 필요합니다") + payload = decode_token(token) + if not payload or payload.get("type") != "access": + raise HTTPException(status_code=401, detail="유효하지 않은 토큰") + # 문서 존재 확인 (image_key 만 있고 doc 가 사라진 케이스 차단) doc = await session.get(Document, doc_id) if doc is None: diff --git a/frontend/src/lib/components/MarkdownDoc.svelte b/frontend/src/lib/components/MarkdownDoc.svelte index 01df7c2..fcd7313 100644 --- a/frontend/src/lib/components/MarkdownDoc.svelte +++ b/frontend/src/lib/components/MarkdownDoc.svelte @@ -16,6 +16,7 @@ * - md_status badge (processing/success/skipped/failed) — MarkdownStatusBadge 위임 */ import { renderDocMarkdown } from '$lib/utils/docMarkdown'; + import { getAccessToken } from '$lib/api'; import MarkdownStatusBadge from '$lib/components/MarkdownStatusBadge.svelte'; type Props = { @@ -115,8 +116,15 @@ if (!key) continue; const alt = ph.getAttribute('data-md-image-alt') ?? ''; + // 는 Authorization header 를 못 보내므로 ?token= 쿼리 파라미터로 access + // token 전달 (기존 /api/documents/{id}/file?token= iframe 패턴과 동일). + const accessToken = getAccessToken(); + if (!accessToken) { + // 로그아웃 상태 — placeholder 유지 + continue; + } const img = document.createElement('img'); - img.src = `/api/documents/${documentId}/images/${encodeURIComponent(key)}/raw`; + img.src = `/api/documents/${documentId}/images/${encodeURIComponent(key)}/raw?token=${encodeURIComponent(accessToken)}`; img.alt = alt; img.loading = 'lazy'; img.className = 'md-image';