개인정보가 새지 않게 기본값을 닫아 두는 구조: 자동화 업체에 주문 정보를 맡기기 전에
남의 기록을 열면 장소 정보가 그대로 내려가고, 공유 미리보기에 칸 하나만 더해도 밖으로 나가는 구조였습니다. 허용 목록과 권한 자동 테스트로 기본값을 닫고, 사진 위치정보는 지웁니다.

남의 보드게임 기록을 열었더니 "우리집"으로 저장한 장소가 앱이 받는 데이터에 그대로 들어 있었습니다. RankBoard를 점검하다 찾은 문제입니다. 개발자가 칸 하나를 더하거나 검사 하나를 빠뜨리기만 해도 이런 틈이 생깁니다. 개인정보는 실수 한 번에도 샐 수 있어서, 처음부터 기본값을 닫아 둡니다. 아래에 고친 방법을 적고, 자동화 업체에 고객 주문 정보를 맡길 때 확인할 점도 함께 정리했습니다.
점검에서 드러난 문제
RankBoard는 보드게임 결과를 기록하면 상대 전적과 랭킹이 쌓이는 iOS·Android 앱입니다. 기록에는 함께한 사람, 게임을 한 장소가 들어가고, 기록을 친구에게 보여 주는 공유 링크도 있습니다. 점검해 보니 다음과 같은 구조가 있었습니다.
남의 기록을 열면 장소가 그대로 보였습니다. 다른 사람의 기록을 열었을 때 "우리집"처럼 실제 장소로 저장한 정보와 초대 정보가 그대로 내려갔습니다. 화면에 표시하지 않더라도 앱이 받는 데이터 안에는 들어 있었습니다.
공유 미리보기에 칸을 더하면 그대로 밖에 나갔습니다. 공유 링크의 미리보기는 로그인 없이 누구나 부를 수 있습니다. 개발자가 이 응답에 칸을 하나 더하면 그 칸은 그대로 외부에 노출되는 구조였습니다.
장소 번호가 1부터 차례로 매겨져 있었습니다. 번호가 1, 2, 3 순서라면 번호만 바꿔 가며 조회해 볼 수 있습니다. 권한 검사가 하나라도 빠진 곳이 있으면 남의 주소를 볼 수 있는 상태였습니다.
어느 쪽도 누가 크게 실수했다고 보기 어렵습니다. 기능을 더하다 보면 자연스럽게 생기는 틈입니다. 그래서 개인의 주의에 기대지 않고 구조를 바꿨습니다.
기본값을 어떻게 닫았나요?
가리는 규칙을 한 곳에 모았습니다. 어떤 정보를 누구에게 가릴지 판단하는 규칙을 기능마다 흩어 두지 않고 한 파일에 모았습니다. 보는 사람이 누구인지 분명하지 않으면 기본으로 가립니다.
공유 응답은 허용 목록으로만 내보냅니다. 로그인 없이 열리는 공유 응답에는 허용 목록에 적힌 칸만 나갑니다. 개발자가 새 칸을 더해도 목록에 없으면 자동으로 비워집니다. 내보낼 칸을 일부러 적어야만 나가는 구조라 실수로 새는 길이 닫힙니다.
남의 것은 '없음'으로 답합니다. 남의 기록이나 장소를 요청하면 "권한 없음" 대신 "없음"으로 답합니다. 그 번호의 자료가 있는지조차 알려 주지 않으려는 처리입니다.
권한 검사는 자동 테스트가 전수 검사합니다. 예전에는 API마다 권한 검사를 사람이 챙겼습니다. 지금은 자동 테스트가 모든 API의 권한을 빠짐없이 검사하고, 새로 만든 API도 테스트에 자동으로 포함됩니다. 가리는 규칙과 공유 허용 목록도 테스트로 고정해 두어서, 누가 바꾸면 테스트가 먼저 알려 줍니다.
로그인 없이 열리는 API를 줄였습니다. 꼭 필요한 것만 남겨 59개에서 41개로 줄였습니다. 밖에서 누구나 부를 수 있는 입구가 적을수록 지킬 곳도 줄어듭니다.
| 항목 | 바꾸기 전 | 바꾼 뒤 |
|---|---|---|
| 로그인 없이 열린 API | 59개 | 41개 |
| 공유 응답에 나가는 칸 | 하나씩 사람이 확인 | 허용 목록에 있는 칸만 자동으로 나감 |
| 권한 검사 | API마다 수동으로 챙김 | 자동 테스트가 모든 API를 전수 검사 |
| 남의 자료 요청 | 존재가 드러날 수 있음 | '없음'으로 답해 존재를 숨김 |
TIP자동화 업체에 보안을 물을 때 "조심하겠습니다"라는 답만 듣고 끝내지 마세요. "새 기능을 더하면 그 기능도 자동으로 권한 검사를 받나요?"처럼 구조를 묻는 질문을 하나 더 하면 답의 깊이가 달라집니다.
사진과 파일 업로드에서 막은 것
RankBoard는 사진과 파일 업로드도 같은 생각으로 처리합니다. 휴대폰 사진에는 찍은 위치(GPS)가 EXIF라는 정보로 함께 저장될 수 있습니다. 사진 한 장을 올렸을 뿐인데 집 위치가 같이 올라가는 셈입니다. RankBoard는 업로드한 사진에서 이 위치정보를 지우고 저장합니다. 파일 확장자만 바꿔 다른 종류의 파일을 올리는 경우를 막기 위해 파일 형식이 진짜인지도 검사합니다.
회사 업무에서도 사진이 오가는 일이 많습니다. 반품 상품 사진, 배송 파손 사진, 현장 사진을 받아 정리하는 자동화라면 저장 전에 위치정보를 지우는지 확인할 만합니다.
자동화 업체에 주문 정보를 맡길 때는 무엇을 확인하나요?
쇼핑몰 주문 파일에는 받는 분 이름, 전화번호, 주소가 들어 있습니다. RankBoard에서 겪은 문제를 회사 업무에 옮겨 보면 확인할 항목이 정해집니다.
| RankBoard에서 겪은 문제 | 주문 자동화에서 물어볼 질문 |
|---|---|
| 남의 기록에 장소가 그대로 내려감 | 화면이나 결과 파일에 꼭 필요한 항목만 나가나요? |
| 공유 미리보기에 칸을 더하면 노출 | 로그인 없이 열리는 화면이나 링크가 있나요? 거기에는 어떤 항목이 나가나요? |
| 1부터 차례인 번호로 남의 자료 조회 | 주소창의 번호만 바꾸면 다른 주문이 보이나요? |
| 권한 검사를 기능마다 사람이 챙김 | 권한 검사를 자동 테스트로 확인하나요? |
| 사진에 위치정보가 남음 | 받은 사진이나 파일에서 불필요한 정보를 지우나요? |
가장 확실한 방법은 업체 서버에 고객 정보가 아예 가지 않게 설계하는 것입니다. 여러 쇼핑몰 주문을 합치는 일은 브라우저 안에서 처리할 수 있다는 내용을 주문 엑셀 합치기 글에서 다뤘습니다. 업체 서버를 거쳐야 하는 업무라면 위 질문으로 기본값이 닫혀 있는지 확인합니다. 판매처 API 연동처럼 인증키를 맡기는 경우의 기준은 판매처 API와 엑셀 비교 글에 정리했습니다.
TIP시험 단계에서는 이름, 전화번호, 주소 열을 지우거나 가짜 값으로 바꾼 주문 파일을 건네세요. 열 구조와 상품 정보만 있어도 대부분의 자동화는 만들 수 있고, 업체가 실제 정보를 보지 않아도 됩니다.
업체를 고르는 기준
업체를 고를 때는 실수해도 정보가 나가지 않는 장치가 있는지 물어보세요. 보는 사람이 불분명하면 가리는지, 권한 검사를 사람 대신 테스트가 빠짐없이 확인하는지가 그 장치에 해당합니다.
자주 묻는 질문
기본값을 닫아 둔다는 게 무슨 뜻인가요?
보여 줘도 되는지 확실하지 않으면 일단 가리는 것을 기본으로 정한다는 뜻입니다. 밖으로 내보낼 항목은 허용 목록에 적힌 것만 나가고, 목록에 없는 항목은 개발자가 새로 더해도 자동으로 비워집니다.
남의 자료를 열면 '권한 없음' 대신 '없음'으로 답하는 이유는 무엇인가요?
'권한 없음'이라고 답하면 그 번호의 자료가 존재한다는 사실은 알려 주게 됩니다. '없음'으로 답하면 번호를 바꿔 가며 찔러 보는 사람에게 아무 단서도 주지 않습니다.
자동화 업체가 권한 검사를 제대로 했는지 어떻게 확인하나요?
권한 검사를 사람이 기능마다 챙기는지, 자동 테스트가 모든 기능을 빠짐없이 검사하는지 물어봅니다. 새 기능이 생겨도 자동 테스트에 함께 걸리는 구조라면 빠뜨릴 가능성이 줄어듭니다.
사진 파일에도 개인정보가 들어 있나요?
휴대폰으로 찍은 사진에는 촬영 위치(GPS)가 EXIF라는 정보로 함께 저장될 수 있습니다. 반품 사진이나 현장 사진을 받아 처리하는 자동화라면 저장하기 전에 이 정보를 지우는지 확인합니다.