
Vercel이나 Supabase로 웹앱을 만들고 보안 체크리스트를 확인하다 보면 마지막에 한 가지 질문이 남습니다.
그래서 내 웹앱은 실제로 괜찮은 걸까?
이 질문에 도메인 주소만 보고 바로 답하기는 어렵습니다.
보안 점검은 확인할 수 있는 자료와 접근 범위에 따라 결과가 달라지기 때문입니다.
이번 글에서는 웹앱 보안 점검을 다음 세 단계로 나누어 살펴보겠습니다.
세 점검의 차이를 먼저 정리하면 다음과 같습니다.
| 구분 | 필요한 자료 | 확인 가능한 내용 | 주요 한계 |
|---|---|---|---|
| 외부 점검 | 도메인 주소 | 외부에 노출된 설정과 정보 | 내부 권한과 코드는 확인 불가 |
| 설정 점검 | 관리자 설정 자료 | Vercel·Supabase 등의 구성 | 실제 코드 흐름은 확인 불가 |
| 코드 점검 | 소스코드와 테스트 환경 | 인증, 권한, 입력값 처리 | 운영 환경과 다를 수 있음 |
어느 한 단계가 다른 단계를 완전히 대체하지는 않습니다.
외부 점검에서 문제가 발견되지 않았다고 내부 설정과 코드까지 안전하다는 뜻은 아닙니다.
반대로 보안 헤더 하나가 없다고 해서 서비스 전체가 즉시 위험하다고 단정할 수도 없습니다.
점검 결과를 해석하려면 무엇을 확인했고, 무엇은 확인하지 못했는지 함께 설명해야 합니다.
외부 점검은 소스코드나 관리자 권한 없이 웹앱 주소에서 확인되는 정보를 살펴보는 방식입니다.
실제 외부 방문자와 비슷한 위치에서 서비스가 무엇을 노출하고 있는지 확인합니다.
다음 항목을 확인할 수 있습니다.
HTTPS가 적용되어 있어도 리디렉션이나 혼합 콘텐츠 설정은 별도로 확인할 필요가 있습니다.
서버 응답에서 다음과 같은 헤더를 확인할 수 있습니다.
Strict-Transport-SecurityContent-Security-PolicyX-Content-Type-OptionsX-Frame-OptionsReferrer-PolicyPermissions-Policy보안 헤더는 브라우저에 적용할 보안 정책을 전달합니다.
다만 특정 헤더가 없다는 사실만으로 취약점이 확정되는 것은 아닙니다. 서비스의 기능과 응답 종류를 함께 살펴봐야 합니다.
예를 들어 Content-Security-Policy는 서비스에서 사용하는 스크립트와 외부 리소스에 맞게 구성해야 합니다.
서비스 소유자의 동의를 받은 범위에서 낮은 강도의 요청으로 다음 항목을 확인할 수 있습니다.
경로가 존재한다는 사실 자체가 취약점은 아닙니다.
관리자 페이지가 공개된 경로에 있더라도 적절한 인증과 권한 검사가 적용되어 있다면 접근은 제한될 수 있습니다.
웹앱은 실행에 필요한 JavaScript를 브라우저로 전송합니다.
이 파일에서 다음과 같은 값을 확인할 수 있습니다.
여기서 주의할 점은 브라우저에 보이는 API Key가 모두 비밀 Key는 아니라는 것입니다.
Supabase의 Publishable Key와 기존 anon key처럼 공개를 전제로 만들어진 값도 있습니다. 키가 보인다는 이유만으로 유출이라고 판단해서는 안 됩니다.
값의 종류와 해당 키로 가능한 작업을 함께 확인해야 합니다.
Source Map이 외부에 공개되어 있으면 압축된 JavaScript와 원본 소스의 관계를 파악하는 데 도움이 될 수 있습니다.
Source Map 공개가 항상 보안 취약점인 것은 아닙니다.
하지만 다음 정보가 불필요하게 포함되어 있다면 검토가 필요합니다.
도메인의 공개 DNS 레코드에서는 다음 항목도 확인할 수 있습니다.
메일을 사용하지 않는 서비스라면 모든 메일 보안 항목이 동일하게 필요한 것은 아닙니다. 실제 도메인 사용 목적을 기준으로 판단해야 합니다.
도메인 기반 외부 점검에는 명확한 한계가 있습니다.
다음 항목은 일반적으로 도메인만으로 정확히 판단하기 어렵습니다.
service_role 또는 Secret Key의 서버 사용 방식따라서 외부 점검 결과는 다음과 같이 표현해야 합니다.
외부에서 확인한 범위에서는 해당 문제가 발견되지 않았습니다.
다음과 같이 단정해서는 안 됩니다.
이 웹앱은 안전합니다.
무료 외부 점검은 전체 보안을 보증하는 검사가 아니라, 다음 점검이 필요한 위치를 찾는 1차 진단에 가깝습니다.
Vercel과 Supabase의 내부 설정은 프로젝트 소유자만 확인할 수 있습니다.
이 단계에서는 관리자 계정의 비밀번호나 Secret Key를 전달할 필요가 없습니다.
다음과 같은 방법을 사용할 수 있습니다.
Vercel 공식 문서도 애플리케이션 코드, 환경변수 노출, 인증과 사용자 접근 관리는 고객의 책임으로 구분합니다.
SELECT, INSERT, UPDATE, DELETE 정책anon과 authenticated 역할의 접근 범위storage.objects 접근 정책Supabase RLS는 테이블 행에 대한 접근을 제한하는 기능입니다. 실제 정책을 확인하지 않고 외부 응답만으로 전체 권한 구조를 판단하기는 어렵습니다.
설정이 올바르더라도 애플리케이션 코드에서 권한을 잘못 처리하면 문제가 발생할 수 있습니다.
코드 점검에서는 기능이 동작하는지만 보는 것이 아니라 데이터가 이동하고 처리되는 흐름을 확인합니다.
다음 항목을 살펴볼 수 있습니다.
화면에서 버튼을 숨기는 것은 접근 통제가 아닙니다.
사용자는 화면을 거치지 않고 API에 직접 요청할 수 있으므로 서버와 데이터베이스에서 권한을 확인해야 합니다.
프론트엔드의 입력값 검사는 사용자 경험에는 도움이 되지만 우회할 수 있습니다.
서버에서도 다음 항목을 검증해야 합니다.
코드에서는 어떤 정보를 로그로 남기는지도 확인해야 합니다.
오류 객체나 요청 객체 전체를 출력하면 예상보다 많은 정보가 로그에 포함될 수 있습니다.
다음 위치에 비밀 값이 하드코딩되어 있지 않은지 확인할 수 있습니다.
코드에서 Secret을 제거했더라도 Git 기록이나 이전 배포에 남아 있다면 해당 키를 교체해야 할 수 있습니다.
Vercel과 Supabase 같은 플랫폼은 개발 속도를 크게 높여줍니다.
하지만 플랫폼이 제공하는 보안과 개발자가 구현해야 하는 보안은 구분해야 합니다.
예를 들어 다음 상황이 동시에 존재할 수 있습니다.
외부 점검만 했다면 첫 번째 상태만 확인할 수 있습니다.
설정 점검을 추가하면 두 번째 상태를 확인할 수 있고, 코드와 실제 사용자 테스트까지 진행해야 세 번째 상태를 확인할 수 있습니다.
OWASP ASVS도 웹 애플리케이션의 기술적 보안 통제를 검증하기 위한 요구사항과 기준을 제공합니다.
2026년 6월 24일, Vercel 또는 Supabase로 만든 웹앱을 대상으로 소수의 무료 외부 보안 점검을 모집할 예정입니다.
이번 무료 점검은 첫 번째 단계인 도메인 기반 외부 점검만 진행합니다.

비밀번호, 관리자 권한, Secret Key와 service_role Key는 받지 않습니다.
서비스 소유자이거나 점검 권한을 가진 사람만 신청할 수 있으며, 발견된 내용은 신청자의 동의 없이 공개하지 않습니다.
무료 점검은 서비스가 안전하다는 인증이 아니라, 외부에서 확인되는 상태와 다음 점검이 필요한 항목을 정리하는 1차 진단입니다.
보안 점검을 받을 때는 결과뿐 아니라 점검 범위를 함께 확인해야 합니다.
도메인만 확인한 점검으로 소스코드와 데이터 권한까지 안전하다고 판단할 수는 없습니다.
반대로 간단한 외부 점검도 현재 외부에 무엇이 노출되어 있는지 파악하고 다음 조치를 결정하는 출발점이 될 수 있습니다.
보안 점검을 다음 세 질문으로 나누어 생각해보세요.
이번 무료 점검에서는 첫 번째 질문부터 확인해보려고 합니다.