이 문서는 결제 연동을 운영 환경에 배포하기 전에 확인해야 할 항목을 정리한 체크리스트예요. 코드 배포, PG 설정, 도메인, 웹훅, 보안 설정을 순서대로 점검해요.
가맹점에서 확인할 것 🧑💻
- 실결제 테스트 완료
- 웹훅 엔드포인트 설정·검증
- 에러 처리·사용자 안내 구현
- 보안 체크리스트 확인
Bootpay가 제공하는 것 🤖
- 테스트 환경(Sandbox) 제공
- 웹훅 발송, 재시도
- 에러 코드·메시지 제공
- 결제 데이터 암호화, 토큰화된 결제 식별값 제공
서비스 오픈 전 확인해야 할 사항들을 정리했어요. 체크리스트를 확인하고, 문제가 없는지 점검해요.
체크리스트
- 결제 금액 서버 검증 완료
- 웹훅 설정 및 검증 완료
- HTTPS 적용
- Sandbox → Production 키 교체
- 실결제 테스트 완료
- 에러 처리·로그 점검
보안 필수 항목 {#security}
1결제 금액 서버 검증
결제 완료 후에는 서버에서 금액을 검증해야 해요. 이 단계를 빠뜨리면 프론트엔드 값 변조나 주문 금액 불일치를 놓칠 수 있어요.
// ✅ 올바른 패턴 — 서버에서 검증
const receipt = await Bootpay.receiptPayment(receipt_id)
const order = await db.orders.findByPk(order_id)
if (receipt.status === 1 && receipt.price === order.total_amount) {
// 검증 성공
} else {
// 금액 불일치 → 결제 취소
await Bootpay.cancelPayment({ receipt_id, cancel_price: receipt.price })
}javascript// ❌ 위험한 패턴 — 프론트엔드 결과만 신뢰
Bootpay.requestPayment({ ... })
.then(response => {
// response.price를 검증 없이 사용
db.orders.update({ status: 'done', amount: response.price })
})javascript상세: 결제 조회
2API 키 분리 관리
| 키 | 노출 위치 | 용도 |
|---|---|---|
client_key (Client Key) |
프론트엔드 OK | 결제창·결제위젯 초기화 |
secret_key (Secret Key) |
서버에만 | Basic Auth, 결제 조회/취소 |
# ✅ 환경 변수로 관리
BOOTPAY_CLIENT_KEY=your_client_key
BOOTPAY_SECRET_KEY=your_secret_key
# ❌ 코드에 직접 입력 금지
const secretKey = 'sk_live_xxxxxxxx' // 절대 금지bash// ✅ 환경 변수에서 읽기
Bootpay.setConfiguration({
client_key: process.env.BOOTPAY_CLIENT_KEY,
secret_key: process.env.BOOTPAY_SECRET_KEY
})javascriptsecret_key가 프론트엔드 코드에 포함되면 결제 조회·취소 같은 서버 API가 노출될 수 있어요. Git에 커밋하지 않도록 .env 파일을 .gitignore에 추가해요.
3가격 계산은 서버에서
// ✅ 서버에서 가격 계산
app.post('/api/orders', async (req, res) => {
const { product_id, quantity, coupon_code } = req.body
// DB에서 상품 가격 조회
const product = await db.products.findByPk(product_id)
let price = product.price * quantity
// 쿠폰 할인도 서버에서 계산
if (coupon_code) {
const coupon = await db.coupons.findOne({ where: { code: coupon_code } })
if (coupon && coupon.isValid()) {
price -= coupon.discount_amount
}
}
const order = await db.orders.create({ price, product_id, quantity })
res.json({ order_id: order.id, price })
})javascript// ❌ 위험 — 프론트엔드에서 보낸 가격 그대로 사용
app.post('/api/orders', async (req, res) => {
const { price } = req.body // 프론트엔드가 변조 가능!
const order = await db.orders.create({ price })
})javascript4HTTPS 필수
- 웹훅 수신 URL: 반드시 HTTPS (HTTP 미지원)
- API 호출:
https://api.bootpay.co.kr(자동 적용) - 가맹점 사이트: 결제 페이지는 HTTPS로 운영하는 것을 권장
5PCI DSS 준수 — 저장 금지 데이터
| 데이터 | 저장 | 비고 |
|---|---|---|
| 카드 번호 전체 (PAN) | 금지 | |
| CVV / CVC | 금지 | |
| 카드 비밀번호 | 금지 | |
| 유효기간 (월/년) | 금지 | |
마스킹된 카드번호 (5570****1074) |
가능 | 표시용 |
카드사명 (신한카드) |
가능 | 표시용 |
| 승인번호 | 가능 | 영수증용 |
카드 원본 정보는 PG/카드사와 Bootpay의 결제 흐름에서 처리돼요. 가맹점은 카드 원본 데이터를 저장하면 안 돼요.
6웹훅 보안
// 웹훅 수신 시 기본 보안
app.post('/webhooks/bootpay', async (req, res) => {
const { receipt_id, status } = req.body
const dedupeKey = `${receipt_id}:${status}`
// 1. 같은 결제 상태 변경을 이미 처리했는지 확인
if (await isProcessed(dedupeKey)) {
return res.status(200).json({ success: true })
}
// 2. 중요한 데이터는 Bootpay API로 재확인
const receipt = await Bootpay.receiptPayment(receipt_id)
// 3. 처리 기록 후 비즈니스 로직 실행
await markProcessed(dedupeKey)
await processWebhook(status, receipt)
res.status(200).json({ success: true })
})javascript보안 체크 요약
| # | 항목 | 확인 |
|---|---|---|
| 1 | 서버에서 결제 금액 검증하고 있는가? | |
| 2 | secret_key가 프론트엔드에 노출되지 않는가? |
|
| 3 | secret_key가 Git에 커밋되지 않는가? |
|
| 4 | 가격 계산을 서버에서 하고 있는가? | |
| 5 | 웹훅 URL이 HTTPS인가? | |
| 6 | 카드 원본 데이터를 저장하지 않는가? | |
| 7 | 웹훅 중복 처리를 방지하고 있는가? | |
| 8 | 샌드박스 → 실결제 키로 전환했는가? | |
| 9 | 에러 시 결제 취소 로직이 있는가? |
결제 결과 안내 옵션
결제 요청 시 아래 옵션을 추가하면 쉽게 결과를 안내할 수 있어요.
| 옵션 | 설명 |
|---|---|
payload.extra.display_success_result = true |
결제 성공 결과 표시 |
payload.extra.display_error_result = true |
결제 실패 결과 표시 |
Bootpay.requestPayment({
// ... 기본 옵션
extra: {
display_success_result: true,
display_error_result: true
}
})javascript자주 묻는 질문
실서비스와 테스트 서비스를 분리하려면?
부트페이 관리자 프로젝트 생성으로 프로젝트를 분리 운영할 수 있어요.
테스트 결제내역을 삭제할 수 있나요?
부트페이 정책상 결제내역은 삭제할 수 없어요. 테스트 결제내역은 무시해요.
PG사를 변경하면 어떻게 하나요?
새 PG사의 연동키로 실결제 모드를 활성화하고, 체크리스트를 다시 점검해요. 자동결제 사용 시 빌링키 재발급이 필요해요.
사업자가 변경되면 어떻게 하나요?
PG사와 다시 계약을 맺어야 해요. 기존 빌링키 사용 여부는 PG사에 문의해요.
판매대금은 언제 정산받나요?
PG사로부터 정산받으며, 정산주기는 PG사와의 계약에 따라 달라요.
부가세 신고 자료는 어디서 받나요?
PG 관리자 페이지에서 다운로드 받아요. 부트페이 데이터는 부가세 신고에 적합하지 않아요.
더 읽을거리
이 페이지는 기술 체크리스트 한정이에요. 오픈 전 기획·운영 판단은 아래 블로그에서 다뤄요.
- 오픈 전 점검 — 기획·운영 체크
- 테스트 → 실결제 전환 가이드 — 전환 시 주의사항
