011. FIDO 2.0 Signature Format - Client Data

FIDO 2.0 Signature Format

FIDO의 3가지 스펙 문서 중 두 번째인 Signature Format에 대해서 정리한다.

참고 FIDO alliance : FIDO 2.0 Signature Format 문서

Client Data

The client data represents the contextual bindings of both the RP and the client platform. It is a key-value mapping with string-valued keys. Values may be any type that has a valid encoding in JSON. It must contain at least the following key-value pairs.

Client Data 는 Relying Party와 Client Platform의 contextual binding을 나타내는 값이다.

Client Data는 문자열을 key값으로 가면 key-value 형태로 매핑되며 JSON에서 유효한 인코딩을 가진 모든 유형을 value로 가질 수 있다.

아래 나오는 것은 Client Data가 꼭 포함해야하는 key-value값들이다.

id:"j53o73ka"}
1
2
3
4
5
6
7
dictionary ClientData {
DOMString challenge;
DOMString facet;
JsonWebKey tokenBinding;
optional object extensions;
DOMString hashAlg;
}
  • DOMString challenge
    Relying Party가 제공하는 base64url기반의 인코딩 값

  • DOMString facet
    Relying Party를 식별하기 위한 문자열
    클라이언트의 애플리케이션이 Native 애플리케이션일 경우 플랫폼을 식별하기위한 값이며, Web 애플리케이션일 경우 완전한 web 출처를 뜻한다.

    참고 web 출처를 정의하는 구문은 RFC 6454를 사용한다.

  • JsonWebKey tokenBinding
    Relying Party와 통신할 때 클라이언트가 Token Binding Protocol 을 위해 사용하는 public key 를 설명하는 객체다.
    Token Binding이 클라이언트와 Relying Party 간의 협의되지 않았다면 생략할 수 있다.

  • optional object extensions
    extensions은 확장된 Authenticator Data 객체다. Signature에 대한 extension은 추후 포스팅에서 다루겠다.

  • DOMString hashAlg
    clientDataHash 를 계산하는 데 사용되는 hash 알고리즘을 말한다. 이것도 추후 포스팅에서 다루도록 하겠다.

    참고
    SHA-256 는 S256
    SHA384 는 S384
    SHA512 는 S512
    SM3 는 SM3의 값을 사용한다.

위에 나온 최소한으로 필요한 속성 이외에도 또 다른 속성이 추가될 수 있다.

Client Platform 계층은 Authenticator에게 요청하기 전에 아래의 단계를 수행한다.

  1. clientDataJSON 은 clientData를 UTF-8로 인코딩한 직렬화된 JSON이라고 가정한다.
  2. clientDataHash 는 hashAlg에 정의된 hash 알고리즘을 사용하여 clientDataJSON 값을 hash한 배열값이다.

clientDataHash 값은 FIDO Authenticator에 의해 Signature와 통합된다. clientDataHash 는 플랫폼 특유의 방식으로 통합 Authenticator에게 전달되며 FIDOEAP에 의해 지정된 Signature Request의 일부로 외부의 Authenticator에게 전달된다.

Client Platform 은 Relying Party 에게 다시 보내는 Signature 객체에 포함되는 정확한 encodedClientData 문자열 값도 보존해야 한다. 이는 동일한 Client Data 에서 다중 JSON 인코딩이 가능하기때문에 필요한 일이다.

hash algorithm 을 뜻하는 hashAlg는 clientData 객체에 포함되어 clientDataHash를 계산하는 데 사용된다. 이렇게 hash algorithm을 알려주면 Relying Party에서도 사용할 수 있으며, Signature 자체에 포함된다.