You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
패스키 등록에서 서버가 검증 실패(HTTP 401, code 2701)를 돌려주면 앱은 그 응답을 액세스 토큰 만료로 보고 재발급 뒤 같은 본문을 다시 보낸다. 서버는 첫 요청에서 이미 챌린지를 소비했으므로 두 번째 요청은 HTTP 400, code 2700(챌린지 만료·무효)으로 끝난다. 화면과 로그에는 2700 만 남고 실제 거절 사유인 2701 은 사라진다.
근거
BE mainPasskeyService.register 는 PasskeyChallengeService.consume 으로 챌린지를 Redis 에서 읽고 바로 지운 뒤 서명·origin 을 검증한다. 검증 실패는 PASSKEY_VERIFICATION_FAILED 로 HTTP 401, code 2701 이다. 지워진 챌린지로 다시 오면 code 2700 이다.
실측: PR fix(setting): 패스키 목록·등록 호출과 실패 처리를 연결한다 (#1944) #1927 QA 기록 d213a92…json (2026-09-06, 실서버, Android 15 에뮬레이터, KeePassDX 공급자). 새 options 를 받고 56초 뒤 등록을 제출했는데 /auth/reissue 200 다음에 /auth/passkey/register 가 400/2700 으로 끝났다. clientDataJSON 의 challenge 는 새 options 값과 같았다. 당시 BE 배포본(fcca1ffd)의 serverProperty 는 웹 origin 하나만 허용했고, Android apk-key-hash origin 허용은 BE#279(2026-09-09 머지)에서 들어왔다. 그래서 첫 응답은 origin 불일치로 2701 이었고, 재시도가 그것을 2700 으로 바꿨다고 보는 것이 코드와 관측에 맞는다.
부수 효과로 필요 없는 재발급이 일어나 리프레시 토큰이 한 번 회전한다.
완료 조건
Bearer 요청의 401 응답 본문 code 가 2701 이면 재발급·재시도·세션 정리 없이 원래 응답을 호출부에 넘긴다. 1202 의 기존 처리와 같은 판별 경로를 쓴다.
토큰 거절 1000, 미확인 코드, 본문 없음·파싱 불가 401 은 지금처럼 재발급 경로를 탄다.
TokenAuthenticatorTest 에서 2701 을 갱신 경로 예시에서 빼고, 업무 오류 쪽 단언(재발급 0회, clearSession() 0회, 원래 본문 보존)에 넣는다.
Activity
github-actions commentedon Oct 7, 2026
bug 이슈는 사이드바 Fields > Priority 로 심각도를 지정해야 합니다. 판정 기준:
값이 비어 있어도 이슈를 닫지는 않습니다. 이 안내는 이슈당 한 번만 답니다.