샘플 보고서 · 가상 회사
직원 6명이 운영하는 온라인 강의·월 구독 서비스입니다. 회원은 1만 2,400명이고, 그중 2,100명이 매달 돈을 냅니다. 개발자 없이 AI 코딩 도구로 두 달 만에 만들어 올봄에 열었습니다.
회원 정보는 외부 데이터베이스 서비스(Supabase)에 두고, 결제는 카드 결제 대행사로 받습니다. 회원 질문에 답하는 «AI 학습 도우미»는 외부 AI 회사에 쓴 만큼 사용료를 내는 방식으로 붙였습니다. 점검을 맡긴 까닭은 개인정보 사고 기사가 잇따르는데, 우리 서비스는 누구도 확인해 본 적이 없어서였습니다.
그대로 두면 회원 1만 2,400명의 정보가 누구에게나 열려 있고, AI 사용료가 며칠 만에 수천만 원 청구될 수 있는 상태였습니다. 먼저 고칠 것 3가지를 고친 뒤 다시 확인했더니 둘 다 막혔습니다. 휴대폰 첫 화면도 8.4초에서 2.3초로 빨라졌습니다.
| 위험 | 무엇이 문제였나 | 그대로 두면 | 고친 뒤 |
|---|---|---|---|
| 빨강 | 1. 회원 정보가 누구에게나 열림 로그인하지 않아도 회원 1만 2,400명의 이름·이메일·전화번호·수강·결제 내역을 읽고 고칠 수 있었음 | 누가 명단을 통째로 가져가거나 바꿀 수 있음 | 초록 밖에서 열면 거절 |
| 빨강 | 2. 관리자용 만능 열쇠가 홈페이지 파일 안에 방문자 누구나 받는 홈페이지 파일에 관리자 열쇠가 들어 있었음 | 그 열쇠로 모든 기록을 읽고 지울 수 있음 | 초록 열쇠를 바꾸고 회사 쪽 서버에만 둠 |
| 빨강 | 3. 번호만 바꾸면 남의 영수증 영수증 주소 끝 번호를 바꾸면 다른 회원의 이름·주소·결제 금액이 보였음 | 회원끼리 서로의 정보를 볼 수 있음 | 초록 본인 것만 열림 |
| 빨강 | 4. AI 사용료 열쇠가 밖에, 한도도 없음 AI 학습 도우미 열쇠도 홈페이지 파일 안에 있었고, 쓰는 양의 한도·알림이 없었음 | 누가 가져가 쓰면 평소 한 달 약 30만 원이던 사용료가 며칠 만에 수천만 원 | 초록 한도·알림을 걸고 열쇠는 회사 쪽에 |
| 노랑 | 5. 관리자 화면 주소만 알면 로그인 화면이 나오고, 비밀번호를 여러 번 틀려도 막지 않았음 | 다른 곳에서 새어 나간 비밀번호를 넣어 보며 들어올 수 있음 | 초록 5번 틀리면 15분 막힘, 휴대폰 확인 한 번 더 |
| 노랑 | 6. 가짜 «결제 완료»가 통함 결제 대행사가 보낸 알림이 진짜인지 확인하지 않았음 | 결제 없이 유료 강의를 열 수 있음 | 초록 가짜 알림은 거절 |
| 노랑 | 7. 휴대폰에서 느림 느린 통신에서 첫 화면이 뜨기까지 8.4초, 처음 받는 양 6.2MB | 강의를 보러 왔다가 하얀 화면만 보고 나가는 손님 | 초록 2.3초, 0.9MB |
| 노랑 | 8. 10월 30일 데이터베이스 서비스 변경 이날부터 새로 만드는 표는 따로 열어 주지 않으면 서비스에서 읽지 못함 | AI 도구로 새 기능을 붙이면 그 기능이 조용히 멈춤 | 초록 새 표를 만들 때 함께 열어 주는 순서를 넣고 미리 시험 |
8번은 위험이 커지는 변경이 아니라, 모르고 있으면 기능이 멈추는 변경입니다. 이미 열려 있는 1번 같은 문제는 이 변경으로 막히지 않습니다.
나머지 5~8번은 같은 주에 이어서 고쳤습니다.
| 문제 | 왜 생겼나 | 이렇게 고침 | 걸린 시간 |
|---|---|---|---|
| 1. 회원 정보 | AI 도구로 기능을 붙일 때마다 새 표가 생겼는데, «본인 것만 보기» 잠금은 처음 만든 표 2개에만 걸려 있었음. 나중에 생긴 표 5개는 잠금이 아예 없었음 | 표 7개 모두에 «본인 것만»·«관리자만» 잠금을 걸고, 관리자 기능은 회사 쪽 서버로 옮김 | 1.5일 |
| 2. 만능 열쇠 | 관리 화면을 빨리 만들려고 홈페이지 쪽에서 관리자 열쇠를 바로 썼음 | 열쇠를 새로 바꾸고 옛 열쇠는 폐기. 새 열쇠는 회사 쪽 서버에만 둠 | 반나절 |
| 3. 남의 영수증 | 영수증을 번호로만 찾고, 그 번호가 로그인한 회원 것인지 확인하지 않았음 | 열 때마다 주인을 확인. 번호도 차례대로 붙이지 않고 짐작하기 어렵게 바꿈 | 1일 |
| 4. AI 사용료 | 홈페이지에서 AI 회사로 바로 불렀고, 쓰는 양의 한도를 정하지 않았음 | 회사 쪽 서버를 거쳐 부르게 바꾸고, 회원당 하루 50번·월 한도·한도의 80%에서 알림. 열쇠도 교체 | 1일 |
| 5. 관리자 화면 | 처음 만든 그대로 둠 | 5번 틀리면 15분 막기. 관리자는 비밀번호 뒤에 휴대폰 확인을 한 번 더 | 반나절 |
| 6. 결제 완료 알림 | 알림에 붙은 서명을 확인하는 부분이 비어 있었음 | 서명을 확인하고, 결제 대행사에 결제 상태를 한 번 더 물어본 뒤에 강의를 엶 | 반나절 |
| 7. 휴대폰 속도 | 첫 화면에서 소개 영상 일부(약 3MB)를 미리 받고, 사진 12장을 원본 크기로 썼음 | 영상은 누를 때만 받기, 사진은 휴대폰 크기로 줄이기, 첫 화면에 필요한 것부터 받기 | 2일 |
| 8. 10월 30일 변경 | 서비스 쪽 변경이라 공지를 보지 못했음 | 새 표를 만들 때 «열어 주기»를 함께 하는 순서를 개발 과정에 넣고, 바뀐 설정을 미리 켜서 시험 | 반나절 |
| 항목 | 전 | 후 | 다시 확인한 방법 |
|---|---|---|---|
| 로그인 없이 읽히는 회원 정보 | 1만 2,400명 전부 | 0명 | 밖에서 표 7개를 하나씩 불러 봄. 모두 거절 |
| 홈페이지 파일 속 비밀 열쇠 | 2개 | 0개 | 홈페이지 파일 전체를 다시 뒤짐. 옛 열쇠로 불러 보니 거절 |
| 남의 영수증 | 열림 | 거절 | 시험 회원 둘이 서로의 번호로 열어 봄 |
| AI 사용료 | 한도 없음 | 회원당 하루 50번 · 월 한도 · 80%에서 알림 | 51번째 요청이 막히는지, 알림 메일이 오는지 확인 |
| 관리자 비밀번호 대입 | 끝없이 시도 가능 | 5번 틀리면 15분 막힘 · 휴대폰 확인 | 틀린 비밀번호를 6번 넣어 봄 |
| 가짜 결제 완료 알림 | 유료 강의가 열림 | 거절 | 서명 없는 알림과 고쳐 쓴 알림을 보내 봄 |
| 휴대폰 첫 화면 | 8.4초 | 2.3초 | 느린 휴대폰 통신을 흉내 내 3번 재서 가운데 값 |
| 첫 화면에서 받는 양 | 6.2MB | 0.9MB | 같은 방법 |
| 10월 30일 뒤 새 기능 | 멈출 수 있음 | 정상 | 바뀐 설정을 미리 켜고 새 표를 만들어 봄 |
고친 뒤 회원 가입, 강의 결제, 강의 보기, AI 학습 도우미 질문, 관리자 로그인까지 실제 브라우저로 다시 해 봤고 모두 제대로 돌았습니다.
위 문제들을 고를 때 기준으로 삼은 실제 사고입니다. 번호는 위 표의 문제 번호입니다. «보도»라고 적은 것은 기사로만 확인했습니다.