로그인 성공과 데이터 접근 권한은 다릅니다
인증은 요청자의 신원을 확인하고, 인가는 그 요청자가 어떤 작업을 할 수 있는지 정합니다. 예약 화면을 숨겼어도 다른 사용자의 예약을 조회·변경하는 서버 요청이 허용되면 권한 경계가 성립하지 않습니다.
Supabase의 RLS는 행 단위 접근 정책입니다. 노출된 테이블의 권한과 정책을 함께 확인하고, 읽기·추가·수정·삭제별 허용과 거부 사례를 검사합니다. 공개용 키와 관리자용 비밀 키를 같은 것으로 취급하지 않습니다. 관리자 권한 키를 브라우저에 넣어서는 안 됩니다. 공식 RLS 설명
비민감 시험 계정 A·B를 분리해 A의 자료에 대한 B의 접근이 실제로 거부되는지 확인합니다. 로그아웃 상태도 포함합니다. 이 글에서는 실제 계정 생성이나 정책 변경을 하지 않았으며, 개인별 URL만 발급한 것을 인증 시험의 대체로 보지 않습니다.
결제 완료는 검증된 서버 이벤트와 연결합니다
브라우저의 완료 페이지로 돌아왔다는 사실만으로 입금·예약 확정을 결정하지 않습니다. 채택한 결제 수단의 비동기 상태를 서버에서 확인하고, 취소·실패·지연도 상태 전이에 포함합니다.
Stripe 웹훅 예에서는 원본 요청 본문, Stripe-Signature와 해당 엔드포인트의 서명 비밀값으로 출처를 검증합니다. 처리한 event ID를 저장해 재전송으로 같은 업무를 중복 실행하지 않도록 합니다. 서로 다른 이벤트 객체가 같은 동작을 가리킬 수도 있으므로 객체 ID·유형과 업무의 중복 방지 조건도 설계합니다. 이벤트 순서가 언제나 기대대로 온다고 가정하지 않습니다. Stripe 웹훅 계약
서명 검증 성공은 금액·상품·고객·예약 연결이 맞다는 판정과 별개입니다. 테스트 모드의 정상·중복·잘못된 서명·지연 사례를 정하고 검증합니다. 여기서 실제 결제를 실행하거나 그 시험이 통과했다고 주장하지 않습니다.
배포된 클라이언트 파일도 공개 입력입니다
Vite의 VITE_ 값은 사용 방식에 따라 빌드된 클라이언트 코드에 포함됩니다. 코드가 압축되거나 소스맵이 없다고 비밀이 되는 것은 아닙니다. 비밀 키를 넣지 말고 서버에서만 필요한 자격 증명과 브라우저 공개 설정을 구분합니다. Vite 환경 변수
격리된 예제에서는 실제 비밀 대신 VITE_DEMO_CANARY=not-a-real-secret-20261029 같은 가짜 표식을 사용해 빌드 산출물의 노출 경로를 검사할 수 있습니다. 표식이 발견되면 공개 파일에 포함됐다는 증거지만, 검색에 없다는 것만으로 모든 비밀이 안전하다는 결론은 나오지 않습니다. 변환·분할·다른 출력 파일·서버 로그도 별도 경로입니다. 이 예제 빌드는 여기서 실행하지 않았습니다.
환경·배포·실사이트를 각각 확인합니다
Vercel의 Production·Preview·Development 환경 값이 의도한 배포에 연결되는지 확인합니다. 환경 변수 변경은 기존 배포를 소급해서 바꾸지 않고 새 배포에 적용됩니다. 실패하면 먼저 해당 배포의 빌드 로그와 실행 로그를 구분하고, 비밀값을 노출하지 않은 오류·시각·리비전을 기록합니다. 로그 보관 시간을 모든 요금제에 같은 수치로 고정하지 않습니다. Vercel 환경 변수
Instant Rollback은 도메인이 가리키는 배포를 되돌리는 기능입니다. 데이터베이스·외부 서비스·Git 이력을 함께 복구하는 기능이 아니며, 롤백 뒤에는 운영 도메인의 자동 할당이 꺼질 수 있으므로 다음 배포 동작까지 확인합니다. 기존 데이터와 되돌릴 코드의 호환성이 필요합니다. 공식 롤백 설명
운영 반영 전 승인 범위와 복구 조건을 정하고, 반영 후 실제 URL에서 핵심 동작과 데이터 상태를 확인합니다. 이 글은 특정 서비스의 설정·결제·배포를 실행한 사례가 아니라 검증할 경계를 설명합니다.
자료 범위
2026년 10월 29일 공식 문서와 저장된 원고를 대조했습니다. 기능의 제공 조건은 버전·계정·환경에 따라 달라집니다. 본문의 예시와 확인 절차를 실제 실행·성능 측정의 증거로 읽지 않습니다.