커머스 API는 별도의 토큰 발급 없이 Basic 인증만으로 바로 호출할 수 있어요. 매뉴얼의 모든 API 문서가 엔드포인트 블록에 Basic Auth 로만 표기된 것은 그래서예요. 액세스 토큰은 매 요청 인증을 줄이고 싶을 때 꺼내 쓰는 선택지고, 구독 승인·해지나 금액 조정처럼 되돌리기 어려운 운영 API 에는 supervisor 권한이 한 겹 더 붙어요.
- 커머스 API는 Basic 인증만으로 바로 호출할 수 있어요. 매뉴얼의 모든 API 문서가
Basic Auth로 표기된 이유예요. - Bearer 액세스 토큰은 기존 연동 호환용이에요. 신규 연동은 Basic 인증을 사용해요.
- 구매자 본인 API 는 프로젝트 인증에 더해
Bootpay-User-JWT또는 엔드포인트가 허용하는user_id가 필요해요. - 키와 토큰은 모두 서버 전용 자산으로 다루고, 프론트엔드에는 절대 노출하지 않아요.
- 일부 운영 API는 supervisor 권한이 필요해요. 권한은 토큰이 아니라 API 연동키에 설정해요.
이런 상황이라면
상품 등록, 고객 생성, 주문 조회처럼 commerce 서버 API를 직접 호출해야 한다면 이 문서가 출발점이에요. 구독 승인·해지, 금액 조정처럼
supervisor가 필요한 API 를 붙일 계획이라면 아래 5번을 먼저 봐요. 결제 SDK 인증을 이미 알고 있어도 키가 다르니 프로젝트와 탭을 다시 확인해요.
이 문서는 커머스 서버 호출에 필요한 최소 인증 흐름만 다뤄요.
1API 키 발급
commerce 인증은 먼저 대시보드에서 키를 확보하는 것부터 시작해요. 결제용 키와 커머스용 키를 헷갈리지 않도록 프로젝트와 탭을 정확히 확인해야 해요.
확인 위치:
- 관리자 콘솔
- 개발자 설정
- API 연동키
- commerce 키 영역
실무에서 먼저 확인할 항목은 다음과 같아요.
- 현재 프로젝트가 맞는가
- sandbox와 운영 환경을 구분했는가
- 서버에 저장할
client_key,secret_key가 commerce용인가
관련 문서:
결제 SDK의 서버 인증은 결제 매뉴얼: API 인증에서 확인해요.
2Basic 인증으로 바로 호출하기
커머스 API는 별도의 토큰 발급 없이 Authorization: Basic 헤더만으로 호출돼요. 커머스 client_key 와 secret_key 를 : 로 이어 Base64 로 인코딩해요.
Authorization: Basic {base64(client_key:secret_key)}curl -X GET "https://api.bootapi.com/v1/products" \
-H "Authorization: Basic $(printf '%s:%s' "$BOOTPAY_COMMERCE_CLIENT_KEY" "$BOOTPAY_COMMERCE_SECRET_KEY" | base64)"bash프로젝트 인증이 필요한 v1 API 의 기본 방식이에요. 구매자 정보를 다루는 엔드포인트에서는 회원 JWT와 각 API 의 인증 조건도 확인해요.
3회원 인증과 서버 경계
브라우저는 자사 서버를 호출하고, 자사 서버가 프로젝트 키와 로그인 세션을 확인한 뒤 v1 API 를 호출해요. secret_key 는 서버의 비밀 저장소에, 회원 JWT 는 서버 세션에 보관해요. 브라우저가 보낸 user_id 나 주문번호를 검증 없이 가맹점 권한 API 에 전달하지 않아요.
Bootpay-User-JWT는 회원 로그인(POST /v1/users/login또는 서버용POST /v1/users/login/token)에서 받아요. 가입 API 는 JWT 를 발급하지 않으므로 가입 후 로그인해요.- 엔드포인트가 JWT 또는 user_id 를 허용하면 둘 중 하나만 보내도 돼요. 둘 다 보내고 다른 회원을 가리키면 403
USER_NOT_MATCH예요.user_id는 secretKey 를 쓰는 가맹점 인증에서만 허용돼요. user_id는 24자리 Bootpay 회원 ID 형식이면 회원 ID 로, 그 밖에는 해당 프로젝트의 외부 회원 ID(ex_uid)로 조회해요.user_ex_uid·user_external_uid·user_uid도 같은 규칙이에요. 로그인 아이디는login_id로 보내요. 대상이 없거나 탈퇴했다면 404USER_NOT_FOUND예요.GET·DELETE /v1/users/session은 JWT 세션 자체를 다루므로 JWT 전용이에요.
엔드포인트별 필수 여부와 선택 JWT 의 처리 방식은 회원 JWT를 확인해요.
4액세스 토큰 (기존 연동)
토큰을 쓰면 이후 요청에 키 대신 Authorization: Bearer {access_token} 을 보낼 수 있어요.
POST /v1/request/token 은 기존 Bearer 연동 호환용이에요. 토큰 발급·갱신·보관 없이 Basic 으로 v1 API 를 호출할 수 있어요. 토큰 발급 API
https://api.bootapi.com/v1/request/tokenBasic Auth/v1/token 은 존재하지 않는 경로라 본문 없는 404 가 돌아와요. 커머스 응답 형태의 404(error_code 가 담긴)와 헷갈리기 쉬워요.
인증은 두 가지 방식 중 하나예요.
| 위치 | 값 | 필수 | 설명 |
|---|---|---|---|
Header |
Authorization: Basic {base64(client_key:secret_key)} | 선택 | 커머스 Client Key와 Secret Key를 : 로 이어 Base64 인코딩해요 |
Body |
server_key | 선택 | 헤더를 쓰지 않을 때. 프로젝트 Server Key |
Body |
private_key | 선택 | 헤더를 쓰지 않을 때. 프로젝트 Private Key |
헤더 없이 본문으로 인증할 때는 server_key · private_key 를 써요. client_key/secret_key 로 보내면 PROJECT_SERVER_KEY_INVALID 로 거절돼요.
Ruby SDK 는 토큰이 없으면 client_key/secret_key 로 Basic 인증을 자동 적용해요.
require 'bootpay'
commerce = BootpayStore::RestClient.new(client_key: '{client_key}', secret_key: '{secret_key}')
puts commerce.get_store # 토큰 발급 없이 바로 호출돼요ruby응답
{
"access_token": "a3f1c0…",
"expire_in": 1800
}json| 필드 | 타입 | 설명 |
|---|---|---|
access_token |
String | 선택 |
expire_in |
Integer | 선택 |
기존 토큰 연동의 갱신
토큰 수명은 30분이에요. 같은 프로젝트로 다시 발급을 요청하면 유효한 토큰이 그대로 돌아오고, 만료 5분 전부터는 새 토큰이 발급돼요. 그래서 "만료 전 재발급"은 같은 엔드포인트를 다시 호출하는 것으로 끝나요.
| 방식 | 설명 | 적합한 경우 |
|---|---|---|
| 요청 실패 시 재발급 | 인증 오류를 받으면 새 토큰 발급 | 초기 연동, 저트래픽 |
| 만료 전 선갱신 | expire_in 을 캐시에 저장하고 만료 전에 재발급 |
운영 서비스, 배치 작업 |
없는 clientKey 는 404 PROJECT_SERVER_KEY_INVALID, secretKey 불일치는 401 PROJECT_PK_INVALID, 없거나 만료된 Bearer 토큰은 404 TOKEN_NOT_FOUND 예요. 아래 인증 오류의 전체 표를 기준으로 처리해요.
갱신 설계 시 체크할 점:
- 여러 서버 인스턴스가 동시에 재발급할 때 충돌이 없는가
- 배치 작업 중 토큰 만료로 실패하지 않는가
- 장애 시 fallback으로 즉시 재발급이 가능한가
특히 상품 동기화나 주문 배치처럼 긴 작업이 있으면 선갱신이 더 안정적이에요.
5API 권한(scope)
API 연동키에는 <역할>:<이름> 형태의 scope 가 붙어요(예: user:product_list). 일부 운영 API 는 supervisor 역할의 scope 가 필요해요. 각 엔드포인트의 필요한 scope 는 v1 API 문서에 적혀 있어요.
권한은 호출할 때 만드는 값이 아니라 API 연동키에 미리 붙여 두는 값이에요.
연동키에 권한을 부여해요
관리자 > 개발자 설정 > API 연동키에서 키를 열어, supervisor 로 지정하거나 필요한 API Scope 를 추가해요. 권한이 없는 키로 호출하면 API_SCOPE_INVALID 로 거절돼요.
요청에 역할을 밝혀요
역할은 Bootpay-Role 헤더로 보낼 수 있어요. 공통 기본값은 user 이지만, 구독 API 는 헤더가 없으면 각 엔드포인트에 적힌 역할을 써요. 따라서 구독의 supervisor 엔드포인트는 키에 해당 scope 가 있으면 헤더 없이도 호출돼요. 역할을 명확히 하고 싶다면 아래처럼 헤더를 넣어요.
curl -X PUT "https://api.bootapi.com/v1/order_subscriptions/{order_subscription_id}/approve" \
-H "Authorization: Basic {base64(client_key:secret_key)}" \
-H "Bootpay-Role: supervisor"bash목록·조회는 user, 그룹 한도·정산 집계는 manager, 승인·해지·금액 조정은 supervisor 예요. 각 API 문서에 적힌 값만 보내요.
구독 요청 이력의 목록·상세(GET /v1/order-subscription-requests, GET /v1/order-subscription-requests/:id)는 project_id 를 넣었을 때만 supervisor 로 프로젝트 전체를 조회해요. 빼면 로그인한 고객 본인 요청만 보는 user 조회로 처리되고, 고객 세션이 없는 서버 인증 호출은 에러로 끝나요. 서버에서는 항상 project_id 를 함께 보내요.
6API 문서와 공통 응답 규칙
v1 문서는 인증 없이 읽을 수 있어요. GET /v1/docs 는 색인, GET /v1/docs/<리소스> 는 리소스 문서예요. API 주소에 Accept: text/markdown 또는 Content-Type: text/markdown 을 보내면 실제 API 를 실행하지 않고 해당 문서를 돌려줘요. POST 에도 적용되므로 문서 확인 과정에서 주문이 생성되지 않아요.
curl -H 'Accept: text/markdown' https://api.bootapi.com/v1/products/example-idbash웹 문서에서는 v1 API 색인부터 확인해요. 목록의 page·limit 규칙은 페이지네이션, 재시도 헤더는 멱등 키, 오류 본문과 442 상태는 오류 응답에 정리돼 있어요.
인증 오류
| HTTP | error_code | 언제 |
|---|---|---|
| 400 | TOKEN_AUTHORIZE_TYPE_INVALID |
Authorization 헤더가 없거나 Basic/Bearer 형식이 아님 |
| 400 | PROJECT_AT_AUTHORIZE_BASIC_INVALID |
Basic 값에서 clientKey 또는 secretKey 를 읽을 수 없음 |
| 404 | PROJECT_SERVER_KEY_INVALID |
없는 clientKey |
| 401 | PROJECT_PK_INVALID |
secretKey 불일치 |
| 401 | PROJECT_CLIENT_KEY_EXPIRED |
만료된 clientKey |
| 401 | PROJECT_NOT_ALLOW |
이용 중지된 프로젝트 |
| 401 | SELLER_NOT_ALLOW |
이용 중지된 판매자 계정 |
| 401 | PROJECT_FIREWALL_BLOCKED |
허용되지 않은 서버 IP |
| 401 | API_SCOPE_INVALID |
필요한 scope 가 키에 없음 |
| 404 | TOKEN_NOT_FOUND |
없거나 만료된 Bearer 토큰 |
7보안 권장사항
키와 토큰은 모두 서버 비밀값으로 취급해요. 편의를 위해 프론트에 넣거나 브라우저 스토리지에 저장하면 인증 체계가 무너져요.
최소 권장사항은 다음과 같아요.
client_key,secret_key는 환경 변수나 시크릿 매니저에 저장해요.- 토큰 발급 로직은 백엔드에서만 실행해요.
- 토큰과 키를 로그에 그대로 남기지 않아요.
- sandbox와 운영 키를 분리해요.
- 주기적으로 키 관리 상태를 점검해요.
commerce는 상품과 주문 전체에 접근하므로 키 유출 영향이 결제 한 건보다 훨씬 넓어요. 그래서 인증을 단순 연결 코드가 아니라 운영 보안 범위로 봐야 해요.








