2026년 9월 30일 올비전 보안 점검을 진행했습니다. 운영 중인 봇 코드뿐 아니라 아직 배포하지 않은 작업, 저장소 기록에 남은 보안 키, 외부 라이브러리와 배포 도구까지 함께 살펴봤습니다. 이 글은 점검에서 찾은 문제를 어떻게 고쳤는지 정리한 기록입니다.
10월 1일 저녁 업데이트: 이 글을 처음 올린 뒤 운영 중인 봇에 남아 있던 13건을 더 고쳐 모든 서버에 적용했습니다. 새로 고친 내용은 아래 '추가로 고친 문제'에 정리했습니다. 이 업데이트로 웹 대시보드는 한 번 다시 로그인해야 합니다.
2026년 10월 1일, 문제 37건의 수정과 보안 키 교체가 모든 서버에 적용되었습니다.
한눈에 보기
- 점검에서 찾은 운영 중인 봇의 문제 37건을 모두 고쳐 모든 서버에 적용했습니다. 먼저 24건을 적용했고, 같은 날 저녁 나머지 13건을 적용했습니다.
- 과거 개발 기록에 남아 있던 보안 키 가운데 운영에서 그대로 쓰이던 두 개를 새로 바꿨습니다.
- 기존 설정과 데이터는 그대로입니다. 웹 대시보드만 한 번 다시 로그인해 주세요.
- 남은 항목은 외부 라이브러리와 배포 도구, 아직 배포하지 않은 작업과 운영에 쓰지 않는 예전 코드에서 나온 것으로, 차례대로 고치고 있습니다.
달라진 동작
업데이트 뒤 처벌이나 설정 저장이 거부되거나 웹 대시보드 로그인이 풀렸다면 아래 내용을 먼저 확인해 주세요.
- 웹 대시보드는 업데이트 뒤 한 번 다시 로그인해야 합니다. 로그아웃하면 그 로그인은 서버에서 폐기되어 같은 쿠키로 다시 들어올 수 없습니다.
- 처벌은 역할 순서를 따릅니다. 봇으로 경고·타임아웃·추방·차단을 하려면 실행하는 분의 가장 높은 역할이 대상보다 위에 있어야 합니다. /관리-처벌과 AI 판사 알림의 조치 버튼이 모두 해당하며, 서버 소유자는 예외입니다.
- 웹 대시보드에서 설정을 저장할 때도 Discord 명령과 같은 권한이 필요합니다. 테러 방지는 서버 소유자, 스팸 차단과 AI 판사는 관리자, 로그 설정은 서버 관리 권한이 기준입니다. AI 판사의 감지 기준만은 서버 관리 권한으로 바꿀 수 있습니다.
- 스팸 차단, 테러 방지, 로그 설정은 /관리-명령권한으로 위임받은 분도 웹 대시보드에서 저장할 수 있습니다.
- /관리-명령권한으로 권한을 관리하는 명령은 권한 확인이 늦어지면 나에게만 보이는 '처리 중' 응답이 먼저 나타난 뒤 결과로 바뀝니다.
- AI 판사는 규칙 채널에서 서버 소유자, 서버 관리 권한이 있는 멤버, 웹훅이 쓴 글만 규칙으로 읽습니다. 규칙을 쓴 분이 서버를 나갔다면 규칙을 다시 올려 주세요.
- 웹 대시보드에서 스팸 로그 채널을 비워도 스팸 차단은 계속 켜져 있으며, 대시보드에도 켜짐으로 표시됩니다. 이때 차단 알림은 메시지가 올라온 채널에만 남습니다.
- 다른 서버가 공유한 밴 기록은 이 서버도 /정보-밴공유동의로 공유에 동의했고, 보는 분에게 멤버 차단 권한이 있을 때만 /정보-유저정보에 표시됩니다. DM에서는 표시되지 않습니다.
- Discord에서 임시 차단을 직접 풀면 봇이 잡아 둔 해제 예약도 함께 취소됩니다.
- /운영-서버초기화를 해도 진행 중인 임시 차단, 레이드 방어 잠금, 채널 폐쇄는 원래대로 해제됩니다.
- 알람을 보내지 못하면 바로 지우지 않고 최대 네 번 다시 보냅니다.
- 봇이 기억하지 못하는 오래된 메시지가 지워지거나 고쳐져도 로그를 남기고, 원래 내용은 알 수 없다고 표시합니다. 여러 메시지를 한꺼번에 지우면 지운 메시지 목록을 파일로 함께 남깁니다.
고친 문제와 수정 방법
점검에서 찾은 문제를 기능별로 나눠, 무엇이 잘못됐고 어떻게 고쳤는지 적었습니다. 아래 24건을 먼저 적용했고, 이어지는 '추가로 고친 문제'의 13건은 같은 날 저녁 적용했습니다. 모두 운영 중인 봇에 적용되었습니다.
처벌·관리
- 역할이 낮은 관리자가 봇을 통해 더 높은 역할의 멤버를 처벌할 수 있었습니다. 이제 실행하는 분의 가장 높은 역할이 대상보다 높을 때만 처리합니다.
- 봇이 다시 시작된 뒤 AI 판사 알림의 조치 버튼을 누르면, 메시지를 쓴 사람 대신 알림에 언급된 다른 사람이 대상이 될 수 있었습니다. 이제 봇이 알림에 직접 적은 대상만 읽고, 원래 메시지를 쓴 사람과 같을 때만 조치합니다.
- 서버를 초기화하면 진행 중인 임시 차단이 기한이 지나도 풀리지 않거나, 채널 폐쇄를 되돌릴 기록이 지워질 수 있었습니다. 이제 초기화해도 이 기록들은 남겨 원래대로 해제하고, 봇이 서버에서 나간 뒤에만 정리합니다.
개인정보
- 공유에 동의하지 않은 서버나 DM에서도 누구나 다른 서버가 공유한 밴 여부를 조회할 수 있었습니다. 이제 공유에 동의한 서버 안에서 멤버 차단 권한이 있는 분에게만 보여 주고, 밴 기록 단계를 열 때만 조회합니다.
웹 대시보드
- 설정을 저장할 때 서버 관리 권한만 확인하고 '서버 소유자 전용', '관리자 전용' 같은 기능별 권한은 확인하지 않았습니다. 이제 Discord 명령과 같은 권한 규칙과 위임 설정으로 확인합니다.
- 스팸 로그 채널을 비우면 대시보드에는 스팸 차단이 꺼진 것으로 보였지만 실제로는 계속 동작했습니다. 이제 실제 상태대로 켜짐으로 표시하고, 로그 채널이 없다는 안내를 함께 보여 줍니다.
테러 방지
- 역할에 위험한 권한이 추가되면, 권한을 바꾼 사람뿐 아니라 그 역할을 원래 갖고 있던 멤버까지 처벌될 수 있었습니다(@everyone 역할이면 서버 전체). 이제 역할의 권한을 되돌리고, 권한을 바꾼 사람에게만 조치합니다.
- 저장된 설정을 읽지 못하는 드문 상황에서 설정이 다시 저장되면, 원래 설정이 임시 기본값으로 덮어써질 수 있었습니다. 이제 읽지 못한 설정은 덮어쓰지 않습니다.
스팸 차단
- 한 서버에서 자동 조치가 몰리면 조치 기록이 가득 차, 다른 서버의 개별 스팸 조치가 멈출 수 있었습니다. 이제 서버마다 기록 한도를 따로 두고, 기록이 가득 차면 가장 많이 쓴 서버의 오래된 기록부터 비웁니다.
- 답장하면서 상대를 본문에 직접 멘션하면 그 멘션을 세지 않아 멘션 도배를 놓칠 수 있었습니다. 이제 본문에 직접 쓴 멘션은 답장 대상이어도 셉니다.
- 아주 긴 메시지를 막으면 로그의 글자 수 한도를 넘어 스팸 로그가 남지 않았습니다. 이제 미리보기를 보여 주고 전체 메시지는 파일로 첨부합니다.
로그
- 봇이 기억하지 못하는 메시지가 지워지거나 고쳐질 때, 그리고 여러 메시지를 한꺼번에 지울 때 로그가 남지 않았습니다. 이제 원래 내용을 알 수 없다는 표시와 함께 기록하고, 한꺼번에 지운 경우에는 지운 메시지 목록을 파일로 남깁니다.
AI 판사와 첨부 파일 검사
- '허용 불가'처럼 금지를 부정형으로 쓴 규칙을 허용으로 잘못 읽어, 제대로 잡은 위반을 취소할 수 있었습니다. 이제 부정형 금지 문구를 금지로 읽고, 허용인지 애매한 문구는 확정 허용으로 보지 않습니다.
- 일반 멤버가 규칙 채널에 쓴 글이 규칙에 반영되거나, 규칙 분석을 반복시켜 다른 서버의 AI 검사까지 늦출 수 있었습니다. 이제 서버 소유자, 서버 관리 권한이 있는 멤버, 웹훅이 쓴 글만 규칙으로 읽고, 규칙 분석은 AI 판사를 켠 서버에서 서버마다 1분에 한 번까지만 합니다.
- 첨부 파일 검사가 시간 초과된 뒤에도 끝나지 않고 계속 기다릴 수 있었습니다. 이제 검사 연결이 닫히면 전송을 바로 멈춥니다.
- 첨부 파일 검사 서버에 연결하지 못하면 미리 열어 둔 파일을 닫지 않아 자원이 쌓일 수 있었습니다. 이제 연결된 뒤에 파일을 열고, 끝나면 항상 닫습니다.
- 첨부 파일 검사 주소를 따로 지정하면 AI 서비스 인증 키가 그 주소로 전달될 수 있었습니다. 올비전 운영 환경은 기본 주소를 써서 해당되지 않았습니다. 이제 다른 주소를 쓰려면 그 주소 전용 키가 필요합니다.
레이드 방어
- 봇이 다시 시작될 때 일시적인 오류가 나면, 잠근 채널을 삭제된 채널로 잘못 보고 복구 기록을 지워 채널이 잠긴 채 남을 수 있었습니다. 이제 채널이 실제로 없다는 응답을 받았을 때만 기록을 지우고, 그 밖의 오류는 다시 시도합니다.
- 레이드 방어를 적용하던 중 저장이나 되돌리기에 실패하면, 원래 채널 권한 기록을 지워 권한을 되돌리지 못할 수 있었습니다. 이제 실패해도 원래 권한 기록을 남기고 해제를 다시 예약합니다.
안정성
- 짧은 이모지 메시지 하나로 봇 전체가 한동안 멈출 수 있었습니다. 이모지만 있는 메시지를 판별하는 검사를 다시 작성해 한 곳에서만 쓰도록 했고, 같은 검사가 다른 곳에 다시 생기지 않도록 자동 점검을 추가했습니다.
- 쉬고 있는 데이터베이스 연결에 오류가 나면 봇이 정리 절차 없이 꺼질 수 있었습니다. 이제 이런 오류는 기록하고 계속 동작합니다.
- 오류 알림 전송이 늦어지는 동안 오류가 몰리면 대기 중인 알림이 메모리를 계속 차지했습니다. 이제 대기열에 상한을 두고, 같은 알림은 묶고, 오래된 알림은 버린 뒤 버린 개수를 알립니다.
- 외부 이미지를 내려받을 때 다른 주소로 넘기거나 거부한 응답을 닫지 않아 연결이 쌓일 수 있었습니다. 이제 이런 응답도 바로 닫습니다.
- 봇을 새 버전으로 바꾸는 순간 드문 타이밍이 겹치면, 새로 띄운 봇이 Discord에 접속한 채 아무 일도 하지 않을 수 있었습니다. 이제 이 경우를 실패로 처리해 정리합니다.
추가로 고친 문제
처음 글을 올린 뒤 운영 중인 봇에 남아 있던 13건을 더 고쳐 10월 1일 저녁 모든 서버에 적용했습니다.
처벌·관리
- 관리자가 Discord에서 임시 차단을 직접 풀었다가 같은 멤버를 다시 차단하면, 처음 임시 차단의 해제 예약이 새 차단까지 풀 수 있었습니다. 이제 Discord에서 차단을 풀면 그 전에 잡힌 해제 예약을 함께 지웁니다. 봇이 꺼져 있어 이를 놓쳤더라도, 해제하기 전에 서버 감사 로그에서 다시 차단한 기록을 확인하면 풀지 않습니다.
- /운영-서버초기화 확인 버튼을 빠르게 여러 번 누르거나 확인한 뒤 취소를 누르면, 초기화가 두 번 실행되거나 진행 화면이 덮일 수 있었습니다. 아주 예전 형식의 확인창은 기한 없이 다시 누를 수도 있었습니다. 이제 확인창 하나에는 한 번만 응답하고, 확인하면 버튼부터 없앤 뒤 초기화하며, 예전 형식의 확인창은 만료로 안내합니다.
웹 대시보드
- 로그아웃해도 브라우저의 로그인 쿠키만 지웠기 때문에, 그 쿠키를 미리 복사해 둔 사람은 만료될 때까지 로그인한 상태로 쓸 수 있었습니다. 이제 로그아웃하면 서버에서 그 로그인을 폐기해, 복사한 쿠키로도 들어올 수 없습니다. 이 변경 때문에 업데이트 전에 로그인한 분은 한 번 다시 로그인해야 합니다.
- Discord가 요청을 잠시 제한하면 대시보드의 서버 목록 화면이 예전에 받아 둔 목록을 기한 없이 다시 썼습니다. 그사이 서버를 나갔거나 권한이 바뀌어도 목록에 남아 보일 수 있었습니다. 이제 5분이 지난 목록은 쓰지 않습니다. 설정을 바꿀 때의 권한 확인은 원래부터 매번 새로 조회합니다.
테러 방지
- 봇을 서버에서 내보내거나 연동을 해제하면 Discord가 그 봇이나 연동 전용 역할을 자동으로 지우는데, 테러 방지가 이를 사람이 역할을 지운 것처럼 세어 반응할 수 있었습니다. 이제 이런 연동 역할 삭제는 테러 방지 대상에서 뺍니다.
AI 판사와 첨부 파일 검사
- 첨부 파일에서 악성 파일을 찾아 보낸 멤버를 24시간 격리할 때, 이미 더 긴 타임아웃이 걸려 있으면 타임아웃이 24시간으로 짧아질 수 있었습니다. 이제 남은 타임아웃이 더 길면 그대로 둡니다.
- 첨부 파일 검사 결과를 받는 도중 연결이 잠깐 끊기거나 시간이 다 되면, 검사 서버의 응답이 잘못된 것으로 보고 한동안 검사 서버 사용을 멈췄습니다. 이제 이런 경우는 일시적인 연결 문제로 구분해 처리하고, 결과를 기다리는 동안 받은 응답도 바로 닫아 연결이 쌓이지 않게 했습니다.
알람
- 알람을 보내는 순간 Discord나 네트워크에 일시적인 문제가 생기면, 알람이 전달되지 않은 채 지워졌습니다. 이제 어디에도 전달하지 못하면 알람을 남겨 두고 1분, 5분, 15분, 1시간 뒤에 다시 보냅니다. 채널이 사라졌거나 보낼 권한이 없는 것처럼 다시 보내도 소용없는 경우에만 정리합니다.
명령 응답
- /관리-명령권한으로 권한을 관리하는 명령은 실행 전에 지금 권한을 다시 확인합니다. 이 확인이 늦어지면 Discord가 기다려 주는 3초를 넘겨 명령이 '응답하지 않음'으로 실패할 수 있었습니다. 이제 확인이 1.5초를 넘기면 나에게만 보이는 '처리 중' 응답을 먼저 보내고, 결과가 나오면 그 자리에 보여 줍니다.
이용약관 동의
- 서버에서 이용약관 동의를 거부하면 봇은 안내를 보여 준 뒤 잠시 후 서버에서 나가는데, 그사이 다시 동의해도 그대로 나갔습니다. 이제 나가기 직전에 동의 상태를 다시 확인해, 그사이 동의했다면 서버에 남습니다.
안정성
- 봇을 새 버전으로 바꾸며 기존 봇을 정리하는 도중 한 단계가 실패하면, 데이터베이스 연결 정리 같은 나머지 정리를 건너뛰었습니다. 이제 한 단계가 실패해도 남은 정리를 끝까지 하고 실패를 기록합니다.
- 기존 봇이 맡은 일을 마무리하는 동안 일을 맡을 권한을 잃어도 정상 종료로 기록했습니다. 그사이 새 봇이 일을 넘겨받았을 수 있으므로, 이제 이 경우는 실패로 기록합니다.
- 올비전 웹 대시보드에 파트너 소식을 보여 주려고 가져오는 응답 가운데, 오류이거나 형식이 맞지 않거나 너무 커서 쓰지 않는 응답을 닫지 않아 연결이 남을 수 있었습니다. 이제 쓰지 않는 응답도 바로 닫습니다.
보안 키 교체
점검에서 과거 개발 기록에 보안 키가 남아 있는 것을 확인했습니다. 그중 운영에서 그대로 쓰이던 키 두 개를 새로 바꿨습니다. 나머지 키는 이미 다른 값으로 바뀌어 있어 운영에서 쓰이지 않습니다.
- OpenAI 키: AI 기능에 쓰는 키입니다. 새 키로 바꾸고 옛 키는 폐기했습니다.
- 암호화 키: 저장된 서버 설정을 보호하는 키입니다. 키만 바꾸면 기존 설정을 읽을 수 없게 되므로, 설정을 잃지 않도록 아래 순서로 바꿨습니다.
- 봇이 새 키와 이전 키를 함께 다루도록 고쳐 배포했습니다. 새 키로 읽고 쓰며, 이전 키는 읽기에만 씁니다.
- 바꾸기 전에 데이터베이스와 데이터 파일을 백업했습니다.
- 시험 환경(Preview)에서 먼저 바꾼 뒤 운영 환경에 적용했습니다. 두 환경에는 서로 다른 새 키를 넣었습니다.
- 봇이 저장된 값을 새 키로 다시 암호화했습니다. 평소 설정을 저장하는 순서를 그대로 따르므로 그 사이에 바뀐 설정을 덮어쓰지 않습니다. 내용은 그대로 두고, 다시 풀어 원래 내용과 같은지 확인했습니다.
- 운영 환경에서 1,488개, 시험 환경에서 999개 값을 새 키로 옮겼고 실패는 없었습니다. 이어서 새 키만으로 저장된 설정을 모두 읽을 수 있는지 점검했습니다.
- 교체하는 동안만 둔 이전 키는 마무리 점검을 거쳐 제거합니다.
키를 바꿀 때는 새로 띄운 봇이 기존 봇의 일을 이어받는 방식으로 재시작했습니다. 운영 환경에서 웹 대시보드는 재시작 내내 응답했고, Discord 이벤트 처리는 약 7초 만에 새 봇으로 넘어갔습니다.
검증과 배포 방식
- 문제마다 회귀 테스트를 추가했고, 고치기 전 코드에서는 그 테스트가 실패하는 것을 확인했습니다.
- 같은 판단을 여러 곳에서 따로 하던 부분은 한 곳으로 모았습니다. 웹 대시보드는 Discord 명령과 같은 권한 규칙을 쓰고, 이모지 판별은 한 곳에서만 합니다.
- 수정본은 시험 환경(Preview)에 먼저 배포해 확인한 뒤, 같은 빌드를 그대로 운영에 배포했습니다.
- 추가로 고친 13건도 같은 방식으로 배포했습니다. 운영 환경에서 웹 대시보드는 전환 내내 응답했고, Discord 이벤트 처리는 약 6.5초 만에 새 봇으로 넘어갔습니다.
- 각 수정은 자동 테스트와 배포 뒤 점검으로 확인했습니다. 실제 Discord 서버에서 모든 경우를 하나씩 재현해 보지는 않았습니다.
남은 일
- 외부 라이브러리와 배포 도구에서 찾은 항목을 차례대로 고치고 있습니다.
- 아직 배포하지 않은 작업과 운영에 쓰지 않는 예전 코드에서 나온 항목은, 그 코드를 배포하기 전에 고칩니다.
업데이트 뒤 처벌이나 설정 저장이 거부되면 위의 '달라진 동작'을 먼저 확인해 주세요. 그래도 해결되지 않으면 공식 문의로 알려 주세요.