설계 사례: 소개할 수 있는 것과 내려보내면 안 되는 것
가족 기록을 다루는 서비스의 소개를 쓰면서 가장 쉽게 혼동하는 것은 ‘전시실을 화면에서 숨긴다’와 ‘자료를 전달하지 않는다’입니다. 허브는 박물관의 공간 구성과 설계 이유를 설명할 수 있지만, 이를 설명하려고 실제 가족 사진이나 작품 데이터를 가져올 필요는 없습니다.
좁은 화면에서는 아래 표만 좌우로 스크롤할 수 있습니다. 키보드로는 표에 포커스를 둔 뒤 방향키를 사용하세요.
| 층 | 허용할 정보 | 별도로 막아야 할 실수 |
|---|---|---|
| 공개 소개 HTML | 프로젝트 목적과 공간 설계 설명 | 접힌 요소·주석·JSON 안에 원본 기록을 포함 |
| 클라이언트 입장 화면 | 로그인·초대 확인의 진행 상태 | 화면이 가려졌다는 사실을 데이터 보호로 간주 |
| 데이터 응답 | 현재 요청자에게 허용된 기록만 | 로그인 여부만 확인하고 다른 가족·자료의 소유권 생략 |
| 작품 원본 파일 | 권한을 검사한 접근 또는 제한된 임시 접근 | DB 행은 비공개인데 원본 이미지 주소는 무제한 공개 |
2026년 9월 22일 별도 박물관 소스에서 가족 인증·손님 초대를 확인하는 입장 컴포넌트와 네트워크 연결을 확인하는 컴포넌트를 읽었습니다. 네트워크 안내는 접속 조건을 설명하는 기능이지 가족 신원을 증명하는 기능이 아닙니다. 또한 프런트엔드 코드를 읽은 것만으로 운영 DB 정책이나 이미지 접근 권한이 올바르다고 결론 낼 수 없습니다.
가상의 그림 한 장으로 접근 권한을 시험한다면
실제 가족 기록 대신 ‘연습 그림 A’라는 가짜 파일과 시험 계정을 사용한다고 가정합니다. 다음 표는 아직 실행하지 않은 별도 서비스의 검증 계획입니다. 승인받지 않은 계정이나 제3자의 자료를 대상으로 시험하지 않습니다.
- 로그아웃 상태: 소개는 읽을 수 있지만 가짜 그림의 원본과 비공개 메타데이터는 응답에 없어야 합니다.
- 허용된 가족 계정: 자기 자료를 조회할 수 있어야 합니다. 모든 자료가 열린다는 뜻은 아닙니다.
- 다른 시험 계정: 원본 주소를 알더라도 내용이 전달되지 않아야 합니다. 메뉴가 안 보이는지만 검사하면 이 경우를 놓칩니다.
- 만료·취소된 초대: 페이지를 새로 열거나 원본에 다시 요청했을 때 정한 만료 정책이 적용되는지 확인합니다. 이미 내려받은 사본을 회수할 수 있다는 약속은 하지 않습니다.
Supabase를 쓰는 서비스라면 행의 RLS와 파일 저장소의 접근을 각각 살펴야 합니다. Storage 접근 제어 문서를 기준으로 버킷 공개 여부와 요청자의 권한을 확인합니다. 특정 정책 SQL 하나를 여기서 복사해 적용하는 것은 실제 스키마와 운영 요구를 모르므로 적절하지 않습니다.
검색 제외는 접근 권한의 대체재가 아닙니다
Google의 noindex 설명은 검색 결과에 넣을지에 관한 규칙입니다. 주소를 아는 사람이 파일을 받는 것을 막는 기능이 아닙니다. 그래서 이 허브는 가족 데이터를 옮긴 뒤 noindex로 가리는 방식 대신, 처음부터 공개 HTML·이미지·작업 문서에 포함하지 않는 경계를 유지합니다.
이 사례에서 독자가 가져갈 판단은 ‘로그인 화면이 있으니 안전하다’가 아니라 ‘어느 응답에서 원본이 전달되는가’입니다. 허용·거절 계정을 나눈 점검과 함께 보면 코드, 데이터, 원본 파일을 구분해 확인할 수 있습니다.