공격은 창의적으로 이뤄지지 않습니다. 자동화된 봇이 알려진 구멍을 순서대로 두드려 보고, 열려 있는 곳으로 들어옵니다. 그래서 막는 쪽도 알려진 다섯 곳만 잠그면 대부분 막힙니다.
1. 권한 확인이 화면에서만 이뤄지는 경우
가장 흔하고 가장 위험합니다. 관리자만 보이는 버튼을 화면에서 숨기는 것은 보안이 아닙니다. 주소를 직접 입력하거나 요청을 흉내 내면 그대로 통과됩니다. 권한 확인은 반드시 서버에서, 요청이 들어올 때마다 이뤄져야 합니다.
2. 데이터베이스 보안 규칙이 열려 있는 경우
Supabase나 Firebase처럼 브라우저에서 데이터베이스에 바로 접근하는 구조에서는, 보안 규칙이 곧 유일한 자물쇠입니다. 개발 편의를 위해 전부 허용해 둔 상태로 출시하면 다른 사용자의 데이터를 전부 읽을 수 있습니다.
3. 입력값을 그대로 믿는 경우
입력창에 데이터베이스 명령어나 스크립트를 넣어 공격하는 방식입니다. 검색창, 로그인창, 게시글 작성처럼 사용자가 글자를 넣는 모든 곳이 대상입니다. 입력값은 저장할 때와 화면에 보여줄 때 양쪽에서 처리해야 합니다.
4. 요청 횟수 제한이 없는 경우
같은 사람이 같은 요청을 무한히 반복할 수 있으면 두 가지 문제가 생깁니다. 비밀번호를 계속 시도해 뚫는 것, 그리고 유료 API를 무한히 호출해 요금 폭탄을 만드는 것입니다. 후자는 공격자가 이득을 보지 않아도 대표님만 손해를 봅니다.
5. 파일 업로드에 제한이 없는 경우
용량 제한과 형식 제한이 없으면 서버가 금방 가득 차거나, 실행 가능한 파일이 올라옵니다. 이미지만 받겠다면 확장자가 아니라 실제 파일 내용으로 확인해야 합니다.
완벽한 보안은 없습니다. 하지만 쉬운 먹잇감은 안 될 수 있습니다. 해킹 봇은 문 잠긴 집을 굳이 따지 않습니다. 옆집 문이 열려 있으니까요.