AssetLibrary
범용 콘텐츠 자산 업로드, 보안 검사, R2 저장, presigned URL, 이미지 lightbox UI
상태
| 항목 | 값 |
|---|---|
| Layer | foundation |
| Tier | L0 |
| Status | wip |
| Version | 0.1.0 |
| 가격 | Free (free) |
| 카테고리 | Content |
개요
AssetLibrary 는 이미지, 업로드 오디오, PDF, 첨부파일을 SaaS/Tenant 경계 안에서 저장하고 재사용하기 위한 foundation plugin 입니다. 업로드 전 MIME/확장자/파일 시그니처 검사를 수행하고, R2 private/public disk 분리와 private presigned URL 발급을 제공합니다. 공개 이미지와 업로드 미리보기를 전체 화면으로 확인할 수 있는 공통 image lightbox Blade partial 도 제공합니다.
이미지 크게 보기 UI
이미지를 화면 안에서 크게 확인해야 하는 SaaS 화면은 AssetLibrary 공통 partial 을 사용합니다.
페이지 최상위에 lightbox dialog 를 한 번 렌더링합니다. 다른 <dialog> 내부에 넣으면 전체보기 동작이 브라우저별로 불안정할 수 있습니다.
@include('asset-library::components.image-lightbox')
<figure class="relative overflow-hidden rounded-md border bg-white">
<img class="max-h-72 w-full object-contain"
src="{{ $imageUrl }}"
alt="{{ $imageTitle }}">
@include('asset-library::components.zoom-button', [
'imageSrc' => $imageUrl,
'imageTitle' => $imageTitle,
])
</figure>
업로드 미리보기처럼 img.src 가 JavaScript 로 바뀌는 경우에는 wrapper 에 data-asset-image-lightbox-scope 를 붙이고 imageSrc 를 생략합니다.
<div class="relative" data-asset-image-lightbox-scope>
<img data-preview-image alt="업로드 이미지 미리보기">
@include('asset-library::components.zoom-button', [
'label' => '미리보기 이미지 크게 보기',
])
</div>
lightbox 는 전체 화면 dialog 로 열리며 모바일에서는 브라우저 기본 핀치 줌과 스크롤을 사용할 수 있습니다.
Public / Private 정책
업로드 기능을 구현하기 전 비즈니스 모델에 따라 public/private 공개 정책을 먼저 결정합니다. 판단이 애매하면 AI 는 구현 전에 사용자에게 확인해야 하며, 기본값은 private 입니다.
| 자산 유형 | 권장 visibility |
|---|---|
| 사용자/고객/권한/결제/학습 이력과 연결되는 파일 | private |
| 원본 업로드, 내부 검토 자료, 사용자별 첨부파일 | private |
| 이미지 URL 자체가 외부에 공유되어야 하는 파일 | public |
| SEO/OG, 랜딩, 브랜드, 공개 콘텐츠 이미지 | public |
private presigned URL 은 만료됩니다. 페이지 공유는 요청 시 URL 재발급이 가능하지만, 이미지 URL 자체를 장기 공유해야 하면 public/CDN/custom domain 을 사용합니다.
접근 방식 3가지
| 방식 | 보안 의미 | 적합한 사례 | 주의 |
|---|---|---|---|
| public domain URL | object key 를 알면 누구나 접근 가능 | scripture.how 색상 의미 이미지, 공개 콘텐츠, SEO/OG 이미지 | URL 이 한 번 공유되면 만료 없이 접근 가능 |
| public bucket + 랜덤 key | listing 은 안 되므로 URL 을 모르면 찾기 어려움 | 민감하지 않지만 외부 노출돼도 큰 문제가 없는 콘텐츠 자산 | 권한 보안이 아니라 경로 은닉임. 로그, referer, 공유로 URL 이 새면 계속 접근 가능 |
| private bucket + temporary URL | 권한 확인 후 만료 URL 로 접근 | 사용자 파일, 고객사 자료, 결제/학습/개인정보 관련 자료 | 이미지 URL 자체를 장기 공유해야 하는 용도에는 부적합 |
scripture.how 처럼 콘텐츠 자체가 공개 학습 자료이고 직접 이미지 공유가 필요한 서비스는 public bucket 1개로 운영할 수 있습니다. 반대로 사용자 업로드 원본, 고객사별 비공개 자료, 권한 기반 자료가 생기면 public bucket 에 섞지 말고 private bucket 또는 별도 접근 제어를 사용합니다.
데모
Plugin Store에서 보기: store.codebase.how/plugins/asset-library