Mbtigram / 04 /

The key was a placeholder

유해물 검사를 꺼 버린 자리표시자

API 키 자리에 "<<< 여기 채우세요 >>>"가 남은 채 운영에 올라가 있었음. 상태 화면은 정상이라고 했고, 이미지 검사는 매번 조용히 실패하고 있었음.

설정 파일의 빈칸

Mbtigram은 사용자가 올리는 글과 이미지를 외부 검사 API로 한 번 거름. 그런데 운영 서버 설정의 API 키 자리에 키 대신 <<< 여기 채우세요 >>>가 적혀 있었음. 나중에 채우려고 둔 자리표시자가 그대로 올라간 것.

키가 비어 있는지 보는 안전장치는 있었음. 그런데 자리표시자는 빈 문자열이 아니라서, 글자가 들어 있으니 "키가 있다"로 통과했음.

상태 표시는 전부 정상

  • 상태 확인 주소(/api/health)는 api_key_set: true라고 답했음.
  • 서버는 오류 없이 떠 있었고 사용자는 글과 사진을 평소처럼 올렸음.
  • 실제로는 검사 요청이 매번 실패하고 있었음.

여기에 설정 하나가 겹쳤음. 검사가 실패했을 때 업로드를 막을지 통과시킬지 정하는 값이 "통과"였음. 외부 API가 잠깐 멈췄을 때 아무도 사진을 못 올리는 일을 피하려고 고른 값임. 그래서 이미지가 검사 없이 그대로 올라가는 상태가 계속됐음.

고친 것

자리표시자는 빈 값으로 봄. 설정을 읽는 함수가 <<<로 시작하는 값을 빈 값으로 처리하고, 서버를 켤 때 경고를 찍음. 견본을 복사해 놓고 깜빡해도 이제는 "키 없음"으로 보임.

상태 화면에는 실제 동작을 표시함. /api/health에 moderation.effective를 붙였음. 설정에 적힌 값 대신 지금 실제로 무엇으로 검사하고 있는지를 보여 줌.

"image": "openai"       설정값 — 이것만 보면 안 된다
"effective": "openai"   실제로 도는 것. none 이면 검사가 사실상 없다

그리고 실제로 한 번 불러 봤음. 글과 이미지 모두 외부 API가 진짜 판정을 돌려주는 것까지 확인하고 나서 끝난 걸로 쳤음.

남겨 둔 위험

검사 실패 시 "통과"는 그대로 뒀음. 막는 쪽으로 바꾸면 외부 API가 멈춘 동안 아무도 사진을 못 올림. 대신 위험이 어디까지인지는 적어 뒀음.

  • 위험은 외부 API가 멈춘 시간에만 생김. 평소에는 검사가 정상으로 돎.
  • 글은 서버 안의 금칙어 검사가 따로 돌아서 완전히 무방비는 아님. 이미지는 외부 API가 유일한 방어선임.
  • 멈췄는지는 moderation.effective와 서버 로그로 확인함.