로그인에 패스키를 붙이는 중입니다. localhost에서는 navigator.credentials.create() 가 잘 되고 등록도 성공하는데, 실제 서비스 도메인에 올리니까 등록 버튼 누르는 즉시 이 에러가 납니다.
SecurityError: The relying party ID is not a registrable domain suffix of, nor equal to the current domain.서버에서 rpId를 'app.example.com' 으로 내려주고 프론트는 그걸 그대로 publicKey.rp.id 에 넣습니다. HTTPS 정상이고 인증서도 문제 없어요. 로컬만 되고 배포만 안 되니 뭐가 문젠지 감이 안 옵니다 😅
혹시나 해서 rpId를 'https://app.example.com' 으로도 바꿔봤는데 똑같이 실패합니다.
댓글 2
에러가 '현재 도메인의 registrable suffix가 아니다'라고 나온다는 건, rpId가 지금 접속한 호스트보다 더 구체적(하위)이라는 뜻이에요. 십중팔구 실제 주소창은 example.com 이나 www.example.com 인데 rpId를 app.example.com 으로 주고 있는 상황입니다. www 리다이렉트가 걸려 있어서 사용자가 실제로는 www.example.com 에서 등록을 시도하는 경우가 흔해요. 브라우저 주소창의 실제 호스트를 먼저 확인하세요.
두 가지 더. rpId에는 스킴이나 포트가 절대 들어가면 안 됩니다. 순수 도메인만이에요. 그래서 'https://app.example.com' 으로 바꾼 건 오히려 확실한 실패고요. 그리고 로컬이 무조건 되는 건 localhost가 스펙상 특례라 rpId=localhost가 http에서도 통과하기 때문입니다. 이 특례 때문에 로컬에선 진짜 버그가 안 드러나서 다들 여기서 하루씩 날려요.
정리하면, 주소창 호스트가 www.example.com이면 rpId는 www.example.com 또는 example.com 둘 다 됩니다. 서비스 전체에서 서브도메인 넘나들 거면 rpId를 example.com 으로 통일하는 걸 추천해요. 마지막으로 서버 검증 라이브러리(simplewebauthn 쓰면 verifyRegistrationResponse의 expectedRPID / expectedOrigin)도 프론트 rpId랑 정확히 일치시켜야 합니다. 여기 어긋나면 등록은 되고 검증에서 깨집니다.