- 기술
지난 글에서는 웹사이트가 카카오 같은 IdP에게서 로그인 결과를 받아 사용자를 알아보는 방식을 살펴봤다. 그런데 로그인으로 받은 이름과 이메일은 공식 기관이 보증한 운전 자격과는 다르다. 이번 글은 그 보증된 정보를 사용자가 직접 가지고 다니는 구조를 다룬다.
제주공항 근처 JM렌터카 카운터에서 차 키를 받기 직전이라고 해 보자. 직원이 “운전면허증 보여 주세요”라고 한다. 지갑에서 면허증을 꺼내 건넨다. 직원은 면허증 사진과 얼굴을 번갈아 보고, 유효기간을 확인한 뒤 카드를 돌려준다.
몇 초 만에 끝나는 일이지만 여기에는 세 주체가 있다. 면허증을 만든 경찰청, 면허증을 가지고 다니는 사람, 면허증을 보고 차를 내줄지 판단하는 JM렌터카다. 카운터에 경찰청 직원은 없다. 렌터카 직원이 보는 것은 경찰청이 만든 카드 한 장이다.
이 면허증이 휴대폰 안으로 들어가고, 카운터가 아니라 웹사이트에서 면허를 보여 줘야 한다면 누가 무엇을 할까?
카운터의 직원은 카드 자체를 본다. 실물 면허증에는 위조를 어렵게 하는 장치가 있고, 직원은 사진과 얼굴을 바로 대조할 수 있다.
웹에서는 사정이 다르다. 휴대폰 브라우저로 JM렌터카를 예약하다가, 마지막 단계에서 면허증 사진을 찍어 올리는 화면을 떠올려 보자. JM렌터카가 받는 것은 이미지 파일이다. 파일은 고치기 쉽고, 화면 너머에서는 카드의 위조 방지 장치를 확인할 수 없다. 그 사진이 경찰청이 만든 면허증을 찍은 것인지, 면허가 지금도 유효한지를 파일만 보고 알기는 어렵다.
디지털 운전면허는 면허증을 찍은 사진이 아니다. 이름, 면허 종류, 유효기간 같은 내용을 데이터로 담고, 그 데이터에 경찰청이 서명(signature)을 붙인 것이다.
실물 면허증의 홀로그램은 ‘공식 기관이 만든 카드’라는 표시다. 디지털 운전면허에서는 경찰청의 서명이 그 역할을 맡는다. 서명이 알려 주는 것은 홀로그램보다 더 분명하다. 서명을 확인하면 누가 만들었는지, 그리고 만들어진 뒤 내용이 바뀌지 않았는지를 알 수 있다.
도입 장면의 세 주체에 역할 이름을 붙여 보자.
사용자가 디지털 증명서를 보관하고 꺼내 보여 주는 앱은 Wallet(디지털 지갑 앱)이다. Holder는 역할의 이름이고, Wallet은 사용자가 그 역할을 하는 데 쓰는 도구다. 이 글에서는 역할 자체를 말할 때가 아니면 Holder 대신 ‘사용자’라고 쓴다.
이 구조에서는 일이 두 시점으로 나뉜다. 발급(issuance) 시점에는 경찰청이 사용자의 Wallet에 디지털 운전면허를 넣어 준다. 제시(presentation) 시점에는 JM렌터카가 요청하고, 사용자가 Wallet에서 면허를 보여 준다. 발급은 미리 해 두고, 제시는 필요할 때마다 일어난다.
1편의 카카오 로그인과 비교해 보자. 로그인할 때마다 카카오는 그 자리에서 로그인 결과를 만들어 JM렌터카에 넘긴다. 카카오가 빠지면 로그인이 끝나지 않는다.
디지털 운전면허에서는 경찰청이 미리 발급해 두고, 제시는 사용자의 Wallet과 JM렌터카 사이에서 일어난다. JM렌터카가 제시받을 때마다 경찰청에 이 면허를 물어보지 않아도 되는 방식도 있다. 다만 면허가 취소되거나 정지되지 않았는지는 따로 챙겨야 한다. 경찰청이 여러 면허의 상태를 묶어 게시한 목록을 JM렌터카가 받아 확인할 수도 있고, 경찰청이 유효기간을 짧게 잡아 자주 새로 발급할 수도 있다. 어느 쪽을 쓸지는 Issuer와 서비스가 정한다. 경찰청은 제시가 일어나는 자리에는 없지만, 이런 방식으로 면허의 상태에는 여전히 관여한다.
로그인과 디지털 운전면허는 목적이 다르다. 로그인은 ‘이 계정이 전에 온 그 사람인가?’에 답한다. 디지털 운전면허는 ‘공식 기관이 이 사람의 운전 자격을 보증하는가?’에 답한다. 그래서 둘은 서로를 대신하지 못한다. JM렌터카는 여전히 카카오 로그인으로 회원을 알아보고, 예약 마지막 단계에서 운전 자격을 따로 확인한다.
Verifier는 두 가지를 따로 정한다.
첫째는 무엇을 요청할지다. JM렌터카가 차를 내주는 데 필요한 것은 이름, 면허 유효 여부, 성인 여부(만 19세 이상)다. 그래서 이 세 가지만 요청한다. 생년월일, 주소, 면허번호는 요청하지 않는다.
둘째는 누구를 믿을지다. JM렌터카는 경찰청이 발급한 운전면허만 받는다. 어떤 발급자의 증명서를 받을지 정한 이런 기준을 신뢰 정책(trust policy)이라고 한다.
두 가지 모두 표준이 정하는 것이 아니다. 어떤 정보를 요청하고 어떤 발급자를 믿을지는 서비스가 정한다. 다른 서비스라면 다른 항목을 요청하거나 다른 발급자를 믿을 수 있다.
여기서 서명 확인과 신뢰 판단이 다르다는 것도 드러난다. 서명은 누가 발급했는지를 알려 줄 뿐, 그 발급자를 믿어도 되는지는 알려 주지 않는다. 형태가 똑같은 운전면허라도 신뢰하지 않는 곳에서 발급했다면, JM렌터카는 서명이 맞아도 받지 않는다.
JM렌터카는 디지털 운전면허를 받으면 세 가지를 확인한다.
이 세 가지가 모두 맞아도 확인이 다 끝난 것은 아니다. 발급할 때 증명서를 사용자 휴대폰에 저장된 키와 연결해 두면, 복사한 증명서를 다른 기기에서 보여 주는 일은 막을 수 있다. 다만 이렇게 연결해 두어도 휴대폰을 든 사람이 면허 주인인지까지 보장되지는 않으므로, 사람을 확인하는 방법은 서비스가 따로 정한다.
그런데 성인 여부를 확인하려면 생년월일을 받아야 할까? 실물 면허증을 건네면 생년월일, 주소, 면허번호가 모두 보인다. 디지털 증명서에서는 형식에 따라 필요한 항목만 골라 보여 줄 수 있다. 이것을 선택적 공개(selective disclosure)라고 한다. 실물 신분증을 보여 줄 때 필요 없는 부분을 손으로 가리는 것과 비슷하다. 다만 선택적 공개에서는 보여 준 항목만으로도 경찰청의 서명을 확인할 수 있다.
경찰청이 발급할 때 ‘만 19세 이상인가’라는 항목을 따로 담아 두면, 사용자는 제시할 때 생년월일 대신 성인 여부만 보여 줄 수 있다. 어떤 나이 기준을 담을지는 Issuer가 정한다.
사용자는 Wallet 화면에서 무엇이 나가는지 본다. “JM렌터카가 이름, 면허 유효 여부, 성인 여부를 요청합니다” 같은 화면에서 확인을 누르면, 그 세 항목만 JM렌터카로 간다.
디지털 증명서의 형식(format)은 하나가 아니다. 대표적인 것이 mdoc, SD-JWT VC, W3C VC다.
이 시리즈의 디지털 운전면허는 mdoc을 기본으로 한다.
디지털 증명서를 통틀어 흔히 ‘VC’라고 줄여 부른다. 이 시리즈에서는 W3C 표준을 가리킬 때만 ‘W3C VC’라고 쓰고, 나머지는 디지털 증명서라고 부른다. 세 형식이 어떻게 다른지는 다음 편에서 정리하고, 형식별 내부 구조는 추후 다룰 주제로 남겨 둔다.
역할이 정해졌고, 증명서에 무엇이 담기는지도 봤다. 경찰청은 사용자의 Wallet에 디지털 운전면허를 어떻게 넣어 줄까? JM렌터카는 Wallet에 무엇을 어떻게 요청하고, 응답은 어떤 모양으로 받을까?
경찰청, JM렌터카, Wallet을 만든 회사는 서로 다른 곳이고, Wallet도 하나가 아니다.
디지털 증명서에서는 발급하고, 가지고 다니고, 확인하는 역할이 나뉜다. 서명이 맞는지와 그 발급자를 믿을지는 서로 다른 판단이다.
증명서가 누구 손을 거치는지는 알았다. 그런데 서로 모르는 Issuer와 Verifier가 같은 Wallet과 증명서를 주고받으려면, 무엇을 미리 약속해 두어야 할까?