이 글의 성격은 무엇인가요?
질문 / 문제 해결
내용을 설명해주세요
개발 환경
- 미니앱: 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 동의 플로우를 통해 얻은 값임
[구현한 플로우]
- 클라이언트에서 requestNotificationAgreement()로 알림 동의문(templateCode: halfandhalf-BANBAN_PARTNER_COMPLETE)에 대한 동의를 받음 → onEvent로 newAgreement 정상 수신
- 동의 직후 getAnonymousKey()를 호출해서 받은 result.hash 값을 Firebase에 저장
- 특정 조건(상대방 답변 완료) 충족 시, 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 직접 호출(알림 발송, 결제 등)에는 사용할 수 없다는 내용을 문서에서 확인했습니다.
질문
- 기능성 메시지 발송(send-message) API의 X-Toss-User-Key에 필요한 값은 getAnonymousKey()로는 얻을 수 없고, 반드시 토스 로그인(appLogin, OAuth 인가코드 → access_token 발급) 플로우를 거쳐야 하는 게 맞나요?
- 만약 그렇다면, requestNotificationAgreement()로 알림 동의를 받는 시점과 토스 로그인(appLogin) 시점을 분리해서 운영해도 괜찮은가요, 아니면 동의 시점에 함께 로그인을 받아야 하나요?
- 혹은 프로모션 지급 API의 "서버 없이 지급하기(grantPromotionReward)"처럼, 기능성 메시지 발송에도 토스 로그인 없이 더 가볍게 연동할 수 있는 방법이 있나요?
- errorCode 4010이 “토스 인증 세션 만료” 때문이라면, 정확히 어떤 세션을 가리키는 것인지, 그리고 이 세션을 갱신/유지하려면 어떻게 해야 하는지 알고 싶습니다.
appName (선택)
halfandhalf