hollo 관 · 별채

열쇠의 방

ja· en· ko
처음 오신 분께앱에 '대신 게시해도 좋다'라는 여벌 열쇠를 건네는 구조예요.

앱에 "대신 게시해도 좋다"를 안전하게 건넬 수 있어요. 비밀번호는 건네지 않고, 여벌 열쇠(토큰)만요. 도중에 엿들려도 나쁘게 쓸 수 없는 방법(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);
            }
          }
src/oauth.tsx L323-L343— PKCE 검사 — 스스로 다시 계산해서, 시간이 일정한 비교로

만져 보기

앱은 처음에 「암호말의 그림자」만 건네고, 교환할 때 본체를 보여줘요. 열쇠의 방은 그림자를 다시 만들어 비교해요——그림자에서 암호말은 역산할 수 없어요(일방통행 문과 같아요).

배치도

src/oauth.tsx
/authorize와 /token. PKCE S256, FOR UPDATE로 맞바꿈
src/oauth/middleware.ts
tokenRequired/scopeRequired+클라이언트 인증 세 가지

옆방

바깥 링크