기능성 메시지 발송(send-message) 시 X-Toss-User-Key로 토스 로그인이 반드시 필요한가요?

이 글의 성격은 무엇인가요?

질문 / 문제 해결

내용을 설명해주세요

개발 환경

  • 미니앱: halfandhalf (반반)
  • React Native (Expo 기반)
  • @apps-in-toss/web-framework: 2.9.2
  • Firebase Cloud Functions v2 (Node.js 22, asia-southeast1)
  • mTLS 인증서: 발급/등록 완료, Secret Manager로 관리 중

사용 중인 SDK 버전
@apps-in-toss/web-framework@2.9.2

테스트 환경

  • 실제 런칭 환경 (정식 출시된 미니앱) + 출시 전 새 빌드는 콘솔 테스트(QR/테스트 버튼, intoss-private:// 스킴 + _deploymentId) 환경에서 같이 테스트
  • 이번 문의의 재현은 콘솔 테스트 환경에서 발생, 단 발급받은 식별자 자체는 실제 런칭 환경의 requestNotificationAgreement 동의 플로우를 통해 얻은 값임

[구현한 플로우]

  1. 클라이언트에서 requestNotificationAgreement()로 알림 동의문(templateCode: halfandhalf-BANBAN_PARTNER_COMPLETE)에 대한 동의를 받음 → onEvent로 newAgreement 정상 수신
  2. 동의 직후 getAnonymousKey()를 호출해서 받은 result.hash 값을 Firebase에 저장
  3. 특정 조건(상대방 답변 완료) 충족 시, Firebase Cloud Functions가 트리거되어 저장해둔 hash 값을 X-Toss-User-Key 헤더에 넣어 send-message API를 mTLS로 호출

[API 호출 정보]
POST https://apps-in-toss-api.toss.im/api-partner/v1/apps-in-toss/messenger/send-message

Headers:
X-Toss-User-Key: {getAnonymousKey()의 result.hash 값}
Content-Type: application/json

Body:
{
“templateSetCode”: “halfandhalf-BANBAN_PARTNER_COMPLETE”,
“context”: { “roomCode”: “{실제 coupleCode 값}” }
}

[응답]
HTTP 200이지만 본문은 다음과 같습니다.

{
“resultType”: “FAIL”,
“success”: null,
“error”: {
“errorType”: 0,
“errorCode”: “4010”,
“reason”: “인증 정보를 찾을 수 없어요.”,
“data”: {},
“title”: null
}
}

[추가로 확인한 내용]

  • mTLS 인증서는 정상 등록되어 있고, 이전에 콘솔에서 같은 발송 코드로 테스트 발송에 성공한 이력이 있습니다 (콘솔 캠페인 상세의 “테스트 발송 완료” 기록 확인됨).
  • 개발자 커뮤니티에서 동일한 errorCode 4010 사례를 검색해보니, 프로모션 리워드 지급 API(execute-promotion)에서도 같은 에러가 보고되어 있었고, 한 댓글에서는 “토스 인증 세션이 만료되었을 때” 발생한다는 추측이 있었습니다.
  • 또한 getAnonymousKey()로 얻은 식별키는 "미니앱 내부 식별용"으로만 사용 가능하고 토스 서버 API 직접 호출(알림 발송, 결제 등)에는 사용할 수 없다는 내용을 문서에서 확인했습니다.

질문

  1. 기능성 메시지 발송(send-message) API의 X-Toss-User-Key에 필요한 값은 getAnonymousKey()로는 얻을 수 없고, 반드시 토스 로그인(appLogin, OAuth 인가코드 → access_token 발급) 플로우를 거쳐야 하는 게 맞나요?
  2. 만약 그렇다면, requestNotificationAgreement()로 알림 동의를 받는 시점과 토스 로그인(appLogin) 시점을 분리해서 운영해도 괜찮은가요, 아니면 동의 시점에 함께 로그인을 받아야 하나요?
  3. 혹은 프로모션 지급 API의 "서버 없이 지급하기(grantPromotionReward)"처럼, 기능성 메시지 발송에도 토스 로그인 없이 더 가볍게 연동할 수 있는 방법이 있나요?
  4. errorCode 4010이 “토스 인증 세션 만료” 때문이라면, 정확히 어떤 세션을 가리키는 것인지, 그리고 이 세션을 갱신/유지하려면 어떻게 해야 하는지 알고 싶습니다.

appName (선택)

halfandhalf

안녕하세요 :slight_smile:

  1. 현재는 기능성 메시지 발송시에 토스 로그인으로부터 발급 받은 X-Toss-User-Key 를 써야합니다. getAnonymousKey()로 취득한 anon-key 로도 발송이 가능하도록 곧 배포될 예정입니다.
  2. 분리해서 운영해도 괜찮습니다
  3. 곧 anon-key로도 발송이 가능하시도록 배포될 예정이에요 :man_bowing: 아직 배포 시점이 정해지진 않았습니다.
  4. 헤더의 user-key가 유효하지 않을때 발생하는 에러로 보입니다!

감사합니당^^ 오늘도 좋은 하루 되세요! :heart_hands: