댓글이나 선수평가를 누군가 악의적으로 도배하거나, 운영자를 사칭해서 글을 쓴다면 지울 수 있어야 해요. 근데 볼타랩에는 회원가입이 없으니 "관리자 계정으로 로그인"이라는 흔한 방식 자체가 안 맞았습니다. 그래서 비밀번호 하나로 운영자 권한을 처리하는 방식을 선택했어요.
로그인 상태가 아예 없다
제일 눈에 띄는 설계는 세션이나 쿠키가 전혀 없다는 거예요. 운영자 비밀번호를 한 번 맞혀도 로그인 상태가 유지되지 않고, 선수평가나 댓글을 수정·삭제할 때마다 매번 비밀번호를 다시 입력해야 합니다. 관리용 페이지도 마찬가지로, 페이지를 새로 열 때마다 다시 확인을 거쳐요.
번거롭긴 한데, 의도적인 선택이었어요. 세션을 만들면 토큰 발급, 만료 처리, 탈취 방지까지 같이 신경 써야 하는데, 어차피 운영자는 저 혼자고 작업도 가끔이라 그 복잡도를 들일 이유가 없었습니다. 비밀번호는 요청 본문(POST body)으로만 전송되고 URL에는 절대 안 남아요 — 브라우저 기록이나 서버 로그에 비밀번호가 찍힐 일이 없게요.
비밀번호는 코드 밖에, 확인은 안전하게
운영자 비밀번호는 코드 저장소나 DB에 두지 않고 호스팅 서비스의 비밀값 저장소에만 보관해요. 입력값을 확인할 때도 일반적으로 권장되는 안전한 비교 방식을 써서, 단순 문자열 비교에서 생길 수 있는 허점을 피했습니다.
비밀번호가 제대로 설정되지 않았으면 운영자 기능 자체가 꺼지도록 만들어뒀고, 실제 서비스 환경에서만 켜지게 해서 테스트용 배포나 개발 환경에서는 운영자 권한을 쓸 수 없어요.
운영자가 할 수 있는 일
| 영역 | 가능한 작업 |
|---|---|
| 선수평가 | [운영자] 배지로 작성(레이트리밋 없음), 타인 글 수정, 타인 글 삭제 |
| 베스트스쿼드 댓글 | [운영자] 배지로 작성(레이트리밋 없음), 타인 댓글 삭제 (댓글엔 수정 기능 자체가 없음) |
| 월간 리포트 | 리포트 열람, 마크다운 복사 |
| 문의함 | 문의 열람, 처리완료 체크 |
이게 전부예요. 배치 작업(크론)은 이 비밀번호와 무관한 별도 시크릿으로 돌아가고, DB나 환경변수를 직접 바꾸는 건 Supabase·Vercel 대시보드에서 하는 거라 이 비밀번호 권한 밖입니다.
무작위 대입은 어떻게 막나
비밀번호를 여러 번 틀리면 일정 시간 동안 입력이 제한되는 장치를 두고 있어요. 운영자 비밀번호뿐 아니라 선수평가·댓글 비밀번호에도 함께 적용됩니다. 글을 쓰면서 기록을 한 번 살펴봤는데, 지금까지 우려할 만한 시도는 보이지 않았어요.
비밀값 관리는 "어디 있는지"만 문서화
비밀번호나 API 키 자체는 운영 문서에 절대 적지 않아요. 대신 "이 값이 뭐고, 어디서 발급받고, 재발급은 어떻게 하는지"만 표로 정리해뒀습니다. 실제 값은 비밀값 저장소와 개인 비밀번호 관리 앱에만 있고, 로컬 개발용 사본도 git에는 올라가지 않아요. 키를 교체할 때 확인해야 할 절차도 운영 문서에 같이 정리해뒀지만, 그런 세부 내용은 공개 글에서는 생략합니다.