37장. Native OAuth callback을 상태 기계로 만든다
로그인 시작 시 state, nonce, PKCE verifier, 시작 시각과 expected redirect를 secure temporary storage에 저장한다. 시스템 browser를 열고 callback을 받으면 scheme/host/path, state, 만료, 이미 사용 여부를 검증한다. code는 backend 또는 안전한 native client가 verifier로 한 번 교환한다. refresh token은 WebView JavaScript에 노출하지 않는다.
callback 중 app이 종료될 수 있으므로 AUTH_STARTED, CALLBACK_RECEIVED, TOKEN_EXCHANGED, SESSION_READY를 복구 가능하게 만든다. 같은 callback 재전송, 다른 app이 custom scheme을 가로채는 경우, 사용자가 취소, provider error, clock 변경을 시험한다. claimed HTTPS link를 우선한다.
로그에는 code, token, verifier, cookie를 남기지 않는다. web layer에는 짧은 session handle과 로그인 결과만 전달하고 모든 API는 server authorization을 수행한다. logout은 WebView 상태, native credential, server refresh session, provider logout 범위를 구분한다.