앱에 "대신 게시해도 좋다"를 안전하게 건넬 수 있어요. 비밀번호는 건네지 않고, 여벌 열쇠(토큰)만요. 도중에 엿들려도 나쁘게 쓸 수 없는 방법(PKCE)까지 들어 있어요.
열쇠를 만드는 솜씨가 꼼꼼해요. 여벌 열쇠를 맞바꿀 때는 행 잠금이 걸리고, 약속한 말의 그림자는 시간이 일정한 비교로 검사돼요 — 같은 표를 두 번 쓰는 것도, 엿보기도, 만듦새 쪽에서 막아 뒀어요.
볼거리
- 클라이언트 인증은 client_secret_basic / client_secret_post / none(공개 클라이언트), 세 가지예요
- /token·/revoke·/userinfo는 csrf()에서 일부러 빼 뒀어요(벽의 주석에 이유가 적혀 있어요)
/.well-known/oauth-authorization-server(RFC 8414) 안내판도 관의 뿌리에 서 있어요
경문 한 구절
if (accessGrant.codeChallenge && accessGrant.codeChallengeMethod) {
if (
!form.code_verifier ||
accessGrant.codeChallengeMethod !== "S256"
) {
return c.json(INVALID_GRANT_ERROR, 400);
}
const expectedCodeChallenge = await calculatePKCECodeChallenge(
form.code_verifier,
);
if (
!timingSafeEqualString(
expectedCodeChallenge,
accessGrant.codeChallenge,
)
) {
return c.json(INVALID_GRANT_ERROR, 400);
}
} 만져 보기
앱은 처음에 「암호말의 그림자」만 건네고, 교환할 때 본체를 보여줘요. 열쇠의 방은 그림자를 다시 만들어 비교해요——그림자에서 암호말은 역산할 수 없어요(일방통행 문과 같아요).