WebAuthn(Web Authentication)은 공개 키 암호화를 사용하여 안전하고 비밀번호 없는 피싱 방지 인증을 가능하게 하는 W3C 표준이에요. 보안과 사용자 경험을 향상시키기 위해 패스키와 함께 널리 사용돼요. 하지만 WebAuthn으로 사용자를 인증하는 것은 첫 번째 단계에 불과해요 — 성공적인 인증 후, 여러 API 엔드포인트에서 사용자의 작업을 권한 부여해야 해요.
이 글에서는 다음 방법을 다뤄요:
- 패스키 기반 인증을 위해 WebAuthn을 사용하는 방법.
- WebAuthn 서버에서 bearer 토큰을 받는 방법.
- 반환된 bearer 토큰을 이후 HTTP 요청의 권한 부여에 사용하는 방법.
1. WebAuthn 인증 흐름 이해하기
WebAuthn은 클라이언트(예: 브라우저나 디바이스의 패스키)에 안전하게 저장된 공개 키 암호화와 자격 증명을 중심으로 해요. 인증 흐름은 일반적으로 다음 단계를 포함해요:
1단계: 인증 시작- 클라이언트(브라우저/앱)가 서버에서 WebAuthn 챌린지를 요청해요.
- 서버가 챌린지를 생성하고 클라이언트에 보내요.
- 브라우저가 WebAuthn API(
navigator.credentials.get)를 사용하여 패스키에 저장된 개인 키로 챌린지에 서명해요. - 서명된 어서션이 서버로 다시 전송돼요.
- WebAuthn 서버가 해당 공개 키를 사용하여 어서션을 검증해요.
- 유효한 경우 서버가 사용자를 인증해요.
이 시점에서 사용자가 누구인지 확인했지만 API에 대한 접근 권한을 부여하는 방법이 여전히 필요해요.
2. WebAuthn 성공 후 Bearer 토큰 반환
성공적인 인증 후 서버가 새로운 WebSocket 또는 HTTP 연결을 열기 위해 bearer 토큰을 보내길 원한다면 token = true 매개변수를 전달해요. 예제:
{
"username": "alice@example.com", "token": true
}
성공적인 인증 후 서버가 다음과 같은 응답을 보내요:
{
"verified": "ok",
"authentication": {
"token": "C760C1C39E3D4E829693A13F18F5CFDE537B516336FC48F7BAB0276176F9E6DE"
}
}
요청이 인증되지 않아 연결이 끊길 때 OnWebAuthnUnauthorized 이벤트가 호출돼요. 여기서 WebAuthn 인증이 필요한 엔드포인트와 그렇지 않은 엔드포인트를 구성할 수 있어요.
Bearer 토큰을 사용하는 이유
- 모든 요청에서 재인증할 필요가 없어요.
- 마이크로서비스 전반에 걸쳐 무상태 권한 부여를 허용해요.
- 최신 API 보안 패턴과 원활하게 통합돼요.
3. API 권한 부여에 Bearer 토큰 사용하기
새 토큰을 받으면 이 bearer 토큰으로 인증 헤더를 보내면 돼요. TsgcHTTP1Client의 CustomHeaders 속성을 사용하여 Bearer 토큰을 설정할 수 있어요. 예제:
procedure GetHTTPRequest(const aURL: string; const aToken: string): string;
var
oHTTP: TsgcHTTP1Client;
begin
oHTTP := TsgcHTTP1Client.Create(nil);
Try
oHTTP.Request.CustomHeaders.AddValue('Authorization', 'Bearer ' + aToken);
result := oHTTP.Get(aURL);
Finally
oHTTP.Free;
End;
end;
4. 전체 흐름 개요
전체 고수준 순서는 다음과 같아요:

