dev.syw

버킷을 만들고 파일을 업로드·다운로드하며, 접근 정책으로 보안을 설정하는 법을 배운다.

Storage

Supabase Storage는 이미지, 동영상, 문서 같은 파일을 저장하고 제공하는 기능입니다. 파일은 버킷(bucket) 단위로 관리되며, 버킷마다 공개 여부와 접근 정책을 설정할 수 있습니다. 이 강의에서는 업로드, 공개 URL, 다운로드, 정책을 다룹니다.

학습 목표

  • 버킷을 만들고 공개·비공개를 구분한다.
  • upload로 파일을 업로드한다.
  • getPublicUrl로 공개 파일 주소를 얻는다.
  • Storage 정책으로 접근을 제어한다.

버킷 생성

콘솔의 Storage 메뉴에서 New bucket으로 버킷을 만듭니다. 이때 Public 여부를 선택합니다.

  • Public 버킷 — 누구나 URL로 파일을 볼 수 있음 (프로필 이미지 등)
  • Private 버킷 — 정책에 허용된 사용자만 접근 (개인 문서 등)

파일 업로드

from('버킷명').upload(경로, 파일)로 업로드합니다. 경로에는 폴더 구조를 포함할 수 있습니다.

const { data, error } = await supabase.storage
  .from('avatars')
  .upload(`public/${userId}.png`, file);

같은 경로에 다시 올리려면 upsert: true 옵션을 줍니다.

await supabase.storage
  .from('avatars')
  .upload(`public/${userId}.png`, file, { upsert: true });

공개 URL 얻기

Public 버킷의 파일은 getPublicUrl로 영구 공개 주소를 얻습니다.

const { data } = supabase.storage
  .from('avatars')
  .getPublicUrl(`public/${userId}.png`);

console.log(data.publicUrl);

이 URL을 <img src>에 바로 사용할 수 있습니다.

다운로드와 비공개 접근

Private 버킷은 공개 URL이 없습니다. download로 파일을 직접 받거나, 한시적 서명 URL을 발급합니다.

// 직접 다운로드
const { data } = await supabase.storage
  .from('documents')
  .download(`private/report.pdf`);

// 1시간 동안 유효한 서명 URL
const { data: signed } = await supabase.storage
  .from('documents')
  .createSignedUrl(`private/report.pdf`, 3600);

💡 TIP — 비공개 파일을 외부에 잠깐 공유할 때는 createSignedUrl이 유용합니다. 만료 시간이 지나면 자동으로 접근이 차단됩니다.

Storage 정책

Storage도 RLS 정책으로 보호됩니다. 정책은 내부적으로 storage.objects 테이블에 적용됩니다. 본인 폴더에만 업로드를 허용하는 예입니다.

create policy "본인 폴더만 업로드"
on storage.objects for insert
with check (
  bucket_id = 'avatars'
  and auth.uid()::text = (storage.foldername(name))[1]
);

⚠️ 주의 — Public 버킷이라도 업로드·삭제 정책은 별도로 설정해야 합니다. 정책 없이 두면 인증된 사용자가 다른 사람의 파일을 덮어쓰거나 지울 수 있습니다.

요약

  • 파일은 버킷 단위로 관리하며 Public/Private을 선택합니다.
  • upload로 업로드하고, upsert: true로 덮어쓸 수 있습니다.
  • Public 파일은 getPublicUrl, 비공개 파일은 downloadcreateSignedUrl로 접근합니다.
  • Storage 역시 RLS 정책으로 업로드·삭제 권한을 제어해야 합니다.

연습문제

  1. Public 버킷과 Private 버킷의 차이는 무엇인가?
  2. 같은 경로의 파일을 덮어쓰며 업로드하려면 어떤 옵션을 주는가?
  3. 비공개 파일을 한시적으로 공유할 때 사용하는 메서드는?
  4. Public 버킷에도 정책이 필요한 이유는?

힌트 — 공개 URL과 서명 URL의 차이, 그리고 정책의 적용 범위를 떠올리세요.

💡 연습문제 풀이

불러오는 중…

함께 보면 좋은 자료

댓글 0

Supabase” 강좌에 대한 댓글입니다.

댓글을 작성하려면 로그인이 필요합니다.