본문 바로가기
Q&A해결2026년 8월 22일1분 읽기

패스키(WebAuthn) 등록이 로컬은 되는데 배포 도메인에선 SecurityError로 실패합니다

p
passkey_hyun
조회 423댓글 2

로그인에 패스키를 붙이는 중입니다. 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

김김영삼2개월 전
rpId 규칙에 걸린 겁니다. 에러 문구 그대로예요. rpId는 지금 페이지가 떠 있는 origin의 호스트와 같거나, 그 호스트의 '부모 도메인'이어야 합니다. 반대로 자식(더 좁은) 도메인은 안 됩니다.

에러가 '현재 도메인의 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랑 정확히 일치시켜야 합니다. 여기 어긋나면 등록은 되고 검증에서 깨집니다.
ppasskey_hyun(guest)2개월 전
범인 찾았습니다. www 리다이렉트가 걸려 있어서 실제로는 www.example.com 에서 등록하는데 rpId를 app.example.com 으로 주고 있었네요. rpId를 example.com 으로 통일하고 서버 expectedRPID도 맞추니까 배포에서도 등록됩니다. 로컬 특례 얘기 안 해주셨으면 계속 헤맬 뻔했어요. 정말 감사합니다!
Ctrl+Enter로 등록