# 보안 점검

## 서버 인증 정보

- API 키는 가맹점 서버의 비밀 저장소에만 보관합니다.
- API 키를 브라우저·앱 코드, URL, 로그, 메신저, 이메일 또는 공개 저장소에 포함하지 않습니다.
- 브라우저에서 사용하는 `client_id`는 point3가 가맹점을 식별하는 값으로, API 키와 별개의 값입니다.

## 결과 URL

- `successUrl`의 `orderId`, `payerId`, `amount`는 브라우저를 거쳐 전달되므로 조작될 수 있습니다. 가맹점 서버가 주문의 `sessionId`와 대조한 뒤 승인합니다.
- 결과 URL에 결제 시도 식별값을 추가했다면 현재 시도와 같은지 확인하고, 다른 시도의 결과는 처리하지 않습니다.

## 앱 WebView

- HTML의 base URL은 가맹점이 소유한 HTTPS 도메인으로 지정합니다.
- 구매자 아이디는 가맹점 서버가 회원 정보에서 꺼내 전달합니다. 기기 저장소에 저장하지 않습니다.
- 앱은 지정한 `successUrl`, `failUrl`로 이동하는 경우만 결과로 처리합니다.

## 서버에서 다시 확인할 내용

브라우저 검증을 통과했더라도 가맹점 서버는 현재 구매자의 주문 권한과 주문에 저장된 `sessionId`를 다시 확인합니다. 결제 승인과 결과 조회에 다른 주문이나 세션의 값을 섞어서는 안 됩니다. 화면에서 받은 `payerId`도 조작될 수 있으므로 결제 세션 조회 응답의 값과 대조하세요. 자세한 내용은 [구매자 아이디](/payer-id)를 참고하세요.

[위임 인증](/delegated-authentication)을 사용한다면 `payer_id`는 로그인 세션으로 확인한 회원의 회원 정보에서 꺼냅니다. 위임 인증은 문자 인증을 생략하므로, 로그인한 회원 본인의 `payerId`인지 반드시 확인하세요.

<Callout type="caution" title="성공 URL 이동은 성공이 아닙니다">
  `successUrl` 이동만으로 상품을 지급하거나 성공 화면을 표시하지 마세요. 결제 승인 API 또는 결제 세션 조회 API 응답으로 최종 결과를 판단합니다.
</Callout>

배포 전에 [라이브 전환 체크리스트](/go-live-checklist)를 함께 확인하세요.
