상품권 번호를 어떻게 지키는가
경로를 막는 것과 별개로, 데이터를 통째로 가져가더라도 번호를 읽을 수 없게 만드는 쪽을 봅니다.
등록 재고 175장
결과 차이를 브라우저 안에서 다시 계산해 보여 주는 화면입니다. 실제로 동작하는 공격 코드는 들어 있지 않습니다.
2026-09-14 10:30:00업로드 경로로 파일이 올라가 서버 안에서 실행된 상황
앞의 방어가 모두 실패했다고 가정합니다. 이 상태에서 데이터베이스를 통째로 가져갔을 때 양쪽이 어떻게 보이는지 확인합니다.
지금 구조 — 평문 저장재현 전
내려받은 표 (voucher_stock)
| serial | voucher_no |
|---|---|
| CV10-00041 | 8696-****-****-3721 |
| CV10-00042 | 4426-****-****-1605 |
| CV10-00043 | 1709-****-****-4912 |
| CV10-00044 | 9688-****-****-7614 |
| CV30-00101 | 9709-****-****-2511 |
| CV30-00102 | 8896-****-****-2703 |
재현을 누르면 이 칸의 값이 그대로 드러납니다
번호 자체가 돈이라 표 하나가 곧 피해 금액이 됩니다. 유출 시점을 알아도 이미 쓰인 번호는 되돌리기 어렵습니다.
개편 후 — 암호화 저장, 키 분리재현 전
내려받은 표 (voucher_stock)
| serial | voucher_no_enc |
|---|---|
| CV10-00041 | gAAAAABSguNPHY7yFy5A3plM9_9XQ15hBAzguGJztEVX== |
| CV10-00042 | gAAAAABqFCqVW8SF3UvrspX4irm5rg1Dsw_7HUBEwVTx== |
| CV10-00043 | gAAAAABSmnzTmnC7H385LXjQ8VE1Y-Ayugpk3RWREoQi== |
| CV10-00044 | gAAAAABqW3M1FAXgrhMvC4wCjOvixMg9SyYEgQfufvsV== |
| CV30-00101 | gAAAAABqQagKYSp0Zd8Mih6EDV8CRhZbSej9feYO4QRd== |
| CV30-00102 | gAAAAABg9YNyAS7EmneFyg22kSzvsUb8ANtVKvfm6tGd== |
저장된 값은 언제나 이 형태입니다
되돌리는 열쇠는 이 서버에 두지 않습니다. 표를 통째로 가져가도 값만 가져가는 것이 됩니다.
웹쉘이 올라간 상황 재현을 누르면 서버 안이 열린 상태를 가정하고, 같은 표를 내려받았을 때 양쪽 값이 어떻게 다른지 보여 줍니다.