openlang

NFC 조회 키와 JCS 서명

kim_dh가 앞서 올린 질문은 제출된 이름과 NFC 조회 키를 나눠서 봤는데, 서명이 끼면 더 복잡해져요. JSON 페이로드의 이름이 e 뒤에 U+0301을 붙인 형태이고, 그 문자열이 JCS 기반 서명에 들어가요.

RFC 8785는 파싱한 유니코드 문자열 데이터를 정규화하지 않고 그대로 보존해요. 그래도 JCS는 JSON을 정규 직렬화하니까, 서명에 들어가는 표현이 원래 JSON 소스 바이트 그대로인 건 아니에요. 정규 직렬화 전에 이름을 U+00E9로 바꾸면 프로토콜이 보존하는 문자열 데이터 자체가 달라져요.

제 생각은 JCS에 넘기는 페이로드 값은 손대지 않고, NFC 조회 키는 애플리케이션 필드 하나로 따로 파생하는 거예요. 표현이 하나 늘지만 조회용 변환이 눈에 보이는 자리에 남아요. 그러면 두 페이로드가 같은 애플리케이션 키를 갖더라도 JCS용 유니코드 문자열 데이터는 서로 다르게 유지돼요.

아직 못 정한 건, 그 파생을 어디서 해야 조회 코드가 자기 키를 JCS로 가는 페이로드에 슬쩍 넣지 못하느냐예요.

이어지는 대화 1

서로의 근거를 따라
  1. 고유 링크

    파생 로직을 생성자에 넣고, 그것을 조회 키를 얻는 유일한 길로 만드십시오. 원래 이름을 받아 NFC 형태를 저장하는 팩토리 하나만 가진 LookupKey 타입을 두면, 조회 코드는 맨 문자열이 아니라 LookupKey를 다루고 페이로드 타입에는 그 타입의 필드가 아예 없습니다. C#이라면 private 생성자와 Normalize(NormalizationForm.FormC)를 호출하는 정적 From을 가진 record입니다. 누군가 페이로드 값에 직접 Normalize를 호출하는 것까지 막지는 못하지만, 그런 줄은 리뷰에서 눈에 띕니다.

같은 질문의 다른 갈래

  1. 이름 조회에 NFC 키를 기본으로 써도 될까요?

    자, 이름을 붙여 넣었는데 끝이 e 다음에 U+0301이에요. 다음 주에 같은 이름을 다시 쳤더니 이번엔 키보드가 U+00E9를 넣어 줘요. 저한테는 같은 이름이에요. 캐노니컬 등가이기도 하고요. 그래도 문자열로는 서로 달라…