읽는 데 9분
CardanoWall은 신원을 어떻게 저장하는가
CardanoWall은 신원을 평문 시드가 아니라 암호화된 볼트 암호문으로 저장합니다. 서버가 정확히 무엇을 보관하는지, 사용자의 패스키만으로 무엇을 열 수 있는지, 그리고 왜 시드가 진짜 백업인지를 설명합니다.

CardanoWall은 신원 시드(Identity Seed)를 평문으로 저장하지 않습니다. 서버는 사용자 본인의 패스키만으로 열 수 있는 암호화된 볼트와, 계정을 운영하는 데 필요한 공개적이고 비밀이 아닌 데이터를 보관합니다. 시드 그 자체, 곧 사용자의 신원 그 자체인 것은 사용자 측에 머무릅니다.
핵심 모델을 한 줄로 정리하면 이렇습니다. 신원 시드는 휴대 가능한 신원이자 진짜 백업이고, 호스팅된 볼트는 패스키로 잠금 해제되는 편의 계층일 뿐 수탁(custody)이 아닙니다.
이 글에서는 CardanoWall이 무엇을 저장하는지, 무엇을 의도적으로 읽을 수 없게 했는지, 그리고 문제가 생겼을 때 그것이 무엇을 뜻하는지를 차례로 살펴봅니다.
신원 시드란 무엇이며, 왜 중요합니까?
CardanoWall 신원은 32바이트짜리 신원 시드 하나에서 만들어집니다. 이 시드에서 결정론적 키 파생을 거쳐 실제로 사용하는 키들이 생성됩니다. 레코드에 서명하는 Ed25519 키와, 봉인된 파일을 수신하는 X25519 기반 키들입니다. 동일한 32바이트는 언제 어디서나 동일한 신원을 다시 만들어 냅니다 — 웹사이트, 명령줄 도구, SDK, 또는 개방형 Label 309 파생 규칙을 따르는 그 밖의 어떤 소프트웨어에서든 마찬가지입니다.
바로 이것이 중요한 속성입니다. 시드는 휴대 가능하며, 모든 것을 결정합니다. 키들은 시드에서 파생된 하위 산물입니다. 따라서 저장과 관련해 중요한 질문은 단 하나, 시드가 어디에 있느냐입니다.
답은 이렇습니다. 시드는 사용자에게 있습니다. CardanoWall은 편의를 위해 암호화된 사본을 보관할 수 있지만, 저장하는 것은 읽을 수 있는 시드가 아니라 암호문입니다.
CardanoWall은 실제로 무엇을 저장합니까?
CardanoWall은 계정을 운영하는 데 필요한 서비스 데이터를 저장합니다. 여기에는 다음이 포함됩니다.
- 계정 로그인 상태;
- 청구 및 잔액 레코드;
- 사용자의 공개 신원 키;
- 공개 증명 레코드와 Cardano 트랜잭션 참조;
- 암호화된 신원 볼트 암호문;
- API 키 — 해시 형태로만 보관;
- 각 신원의 라이프사이클 상태와 같은 제품 설정;
- 주소록 항목과 받은편지함 환경설정.
이 목록에 없는 것에 주목하십시오. 신원 시드, 파생된 비공개 서명 키, 파생된 비공개 수신 키, 그리고 복호화된 봉인 파일은 모두 클라이언트 측 비밀입니다. 이것들은 읽을 수 있는 서버 컬럼에 결코 저장되지 않습니다. 암호화된 볼트가 서버에서 시드 관련 정보를 보관하는 유일한 장소이며, 그것도 서버가 열 수 없는 암호문 형태로 보관합니다.
서비스에 보이는 것과 사용자 기기에 머무는 것의 전체 그림은 CardanoWall이 볼 수 있는 것을 참고하십시오.
신원 볼트란 무엇입니까?
신원 볼트는 계정에 속한 신원들의 비밀을 담은 단일 암호화 묶음입니다.
볼트 평문 안에서 각 항목은 신원 하나의 32바이트 시드와, 사용자가 직접 정한 비공개 표시 레이블 — "개인", "홍보 팀" 등 입력한 그대로 — 을 담습니다. (한 계정은 여러 신원을 가질 수 있으며, 각각 자신만의 항목을 갖습니다.) 이 레이블 역시 암호화 안쪽에 있으므로 서버 측에 노출되는 일이 없습니다.
이 모든 것이 저장되기 전에 암호화됩니다. CardanoWall은 그 결과를 계정당 하나의 현재 볼트 행으로, age v1 형식으로 보관합니다. 서버는 그 암호문을 들고 있다가 사용자에게 돌려줄 수는 있지만, 그것을 여는 데 필요한 키 자료는 보유하지 않습니다.
요점은 바로 이것입니다. 볼트는 수탁이 아닙니다. 볼트는 암호화된 편의 캐시입니다. 정본이자 휴대 가능한 산물은 여전히 시드입니다.
무엇이 볼트를 잠금 해제합니까?
등록된 패스키가 볼트를 잠금 해제하며, 그 외에는 어떤 것도 열 수 없습니다.
볼트는 PRF(의사 난수 함수) 확장을 지원하는 WebAuthn 패스키 인자에만 암호화되며, 패스키마다 수신자 스탠자가 하나씩 대응합니다. 호스팅된 볼트에는 비밀번호에서 파생된 스탠자도, 공개 키 스탠자도 의도적으로 없습니다. 잠금 해제 과정에서 사용자의 인증기는 사용자 확인을 수행한 뒤 PRF에서 파생된 키 자료를 브라우저로 전달하고, 그 자료가 볼트를 로컬에서 엽니다.
CardanoWall 서버는 평문 시드도, 복호화된 볼트도, 시드에서 파생된 어떤 비공개 키도 결코 받지 않습니다. 서버 입장에서 아는 것은 계정이 인증되었다는 사실과, 자신이 암호문 덩어리를 돌려줄 수 있다는 사실뿐입니다. 그것을 여는 것은 사용자의 패스키 인증 절차로 구동되는 사용자의 브라우저입니다.
패스키가 이 잠금을 어떻게 제공하는지, 그리고 패스키 유형별 복구 절충점이 무엇인지는 패스키가 신원 볼트를 보호하는 방법을 참고하십시오.
왜 시드를 그냥 서버에 저장하지 않습니까?
그렇게 하면 CardanoWall이 사용자 신원의 수탁자가 되어 버리기 때문입니다 — 그리고 수탁은 바로 이 설계가 피하려는 실패 모드입니다.
만약 어떤 서비스가 평문 시드, 또는 스스로 복호화할 수 있는 시드를 저장한다면, 서버 침해가 곧 사용자 키 침해로 이어질 수 있습니다. 데이터베이스나 서버의 키를 탈취한 공격자는 사용자 행세로 서명하거나 사용자의 봉인된 레코드를 복호화할 수 있게 될지도 모릅니다. 이는 단일 지점에서 발생하는 치명적 장애입니다.
CardanoWall은 다른 약속을 중심으로 설계되었습니다. 데이터베이스가 유출되더라도 신원 시드는 드러나지 않아야 한다는 것입니다. 서버가 시드를 여는 자료를 결코 보유하지 않기 때문입니다. 이 설계는 가상의 침해를 심각하긴 하되 사용자 키에 대해서는 치명적이지 않게 만드는 것을 목표로 합니다.
패스키에만 암호화한다는 선택에는 짚어 둘 만한 구체적 결과가 두 가지 있습니다. 비밀번호에서 파생된 스탠자가 없으므로, 탈취된 볼트에는 무차별 대입(brute-force)할 대상이 없습니다 — 갈아 낼 사람이 정한 패스프레이즈가 존재하지 않습니다. 또한 공개 키 스탠자가 없으므로, 미래의 양자(Shor 방식) 공격이 겨냥할 비대칭 표적도 없습니다. 볼트를 보호하는 키는 사용자의 인증기 안에 담긴 256비트 대칭 값이며, 여기서 관련 양자 위협은 Grover 방식의 탐색이어서 약 128비트의 유효 보안 여유가 남습니다.
이렇게 한다고 해서 모든 위험이 사라지지는 않습니다. 다만 가장 중요한 비밀이 복사되기를 기다리며 읽을 수 있는 서버 컬럼에 놓여 있지는 않다는 뜻입니다.
볼트는 백업입니까?
최후의 백업은 아닙니다. 진짜 휴대 가능한 백업은 신원 시드입니다.
시드만 있으면 CardanoWall, 명령줄 도구, SDK, 데스크톱 앱, 또는 같은 파생 규칙을 따르는 미래의 어떤 Label 309 소프트웨어에서든 동일한 신원을 다시 만들 수 있습니다. 시드는 어디에나 함께 다니는 단 하나의 것입니다.
호스팅된 볼트는 매일 시드를 다시 입력하지 않아도 되게 도와줍니다. 또한 패스키 제공자가 여러 기기에 걸쳐 패스키를 동기화할 때, 로그인된 다른 기기로 옮겨 가는 일도 도울 수 있습니다. 하지만 볼트는 서비스 계층에 속합니다. 볼트는 삭제될 수도, 사용할 수 없게 될 수도, 마지막 패스키를 제거할 때 함께 제거될 수도 있습니다. 저장해 두어야 할 것은 시드입니다. 신원 시드가 여전히 중요한 이유에서 이 점을 더 깊이 다룹니다.
잠금 해제 시 브라우저에서는 무슨 일이 일어납니까?
신원을 잠금 해제하면 브라우저는 비공개 키 자료에 일시적으로 접근해야 합니다. 이는 불가피합니다. 레코드에 서명하려면 클라이언트가 서명 키를 들고 있어야 하고, 봉인된 파일을 복호화하려면 수신 키를 들고 있어야 하기 때문입니다. 이 키들은 잠금 해제 후 브라우저 안에서 시드로부터 파생됩니다.
이 설계는 비밀을 일반적인 영구 브라우저 저장소 밖에 둡니다. 브라우저의 로컬 캐시(IndexedDB)는 암호화된 볼트 암호문 — 서버가 가진 것과 동일한 바이트 — 를 보관할 수 있어, 페이지를 새로고침할 때 네트워크 왕복 없이 패스키 한 번만으로 끝납니다. 평문 시드는 결코 캐시하지 않습니다. 활성 비공개 키는 세션 메모리에 머물며, 애플리케이션의 UI 상태 바깥에 보관되고, 잠금이나 로그아웃 시 최선을 다해(best-effort) 0으로 초기화됩니다.
이것은 하드웨어 격리가 아니라 웹 암호(web-crypto) 모델이며, 그 한계에 대해 정직합니다. 악성 브라우저 확장, 손상된 기기, 또는 잠금 해제된 세션 동안 실행 중인 능동적 악성 스크립트는 사용자가 잠금 해제 상태일 때 메모리에 있는 것을 읽을 수 있습니다. 엄격한 콘텐츠 보안 정책, 최소한의 스크립트, 명시적 동작이 있을 때만 잠금 해제하는 정책은 그 공격 표면을 줄여 주지만, 완전히 없앨 수는 없습니다. CardanoWall은 서버 수탁 위험을 제거합니다. 그러나 신뢰할 수 없는 기기를 안전하게 만들어 주지는 못합니다. 그 작동 원리는 브라우저 저장소와 세션 키에서, 더 넓은 원칙은 왜 키는 기기를 떠나지 않는가에서 다룹니다.
패스키를 제거하면 무슨 일이 일어납니까?
볼트가 그 인자 없이 다시 만들어집니다.
패스키를 제거하면, 현재 볼트는 남은 인자들에 다시 암호화되어 새로운 단일 행으로 기록되며, 기존 암호문을 그 자리에서 교체합니다. 제거된 패스키는 더 이상 현존하는 볼트를 열 수 없습니다. 서비스는 이 점을 저장 경계에서 강제하기까지 합니다. 볼트는 계정이 이미 제거한 자격 증명에 감싸진 채로 기록될 수 없습니다.
이는 현재의 호스팅 볼트에 대한 실질적 폐기입니다. 이것은 서비스 계층의 통제이지, 시간 여행이 아닙니다. 만약 어떤 패스키가 아직 유효한 동안 오용되었다면 — 예를 들어 활성 세션 안에서 볼트를 열어 안의 시드를 읽는 데 사용되었다면 — 공격자는 이미 시드를 손에 넣었을 수 있으며, 이후에 볼트를 다시 암호화하더라도 그것을 되돌릴 수는 없습니다. 그런 경우 올바른 대응은 재설정이 아니라 새 출발입니다. 새 신원을 생성하고, 기존 신원을 비활성화하며, 사람들이 찾으리라 기대하는 곳에 새 공개 키를 게시하는 것입니다.
패스키를 제거하면 어떻게 되는가에서 정확한 순서를 따라 설명합니다.
CardanoWall이 사라지면 어떻게 됩니까?
이미 게시한 증명은 그대로 검증됩니다.
Label 309 증명은 독립적으로 검증 가능하도록 설계되었습니다. 증명 하나를 검증하는 일은 공개 Cardano 데이터, 레코드가 가리킬 때의 공개 콘텐츠 주소 지정 스토리지, 그리고 검증하는 측이 보유한 원본 콘텐츠나 복호화 자료의 사본에 의존합니다. 유효한 증명은 CardanoWall이 온라인 상태로 남아 있을 것을 요구하지 않습니다 — 트랜잭션 참조와 공개 Cardano 탐색기를 가진 사람이라면 누구나 그것을 확인할 수 있습니다.
시드를 저장해 두었다면 사용자의 신원도 살아남습니다. 동일한 32바이트는 어떤 적합한(conformant) 도구에서든 동일한 신원을 재구성합니다.
시드 없이 잃게 되는 것은 그 신원의 미래 사용입니다. 새 서명을 만드는 일과, 그 신원 앞으로 봉인된 레코드를 복호화하는 일이지요. 이미 게시한 증명은 영원히 검증 가능하게 남지만, 더 이상 그 신원으로서 행동할 수는 없습니다. 이 비대칭성 — 게시된 증명은 영구적이지만, 미래 사용은 시드 보유에 달려 있다는 점 — 은 수탁자를 두지 않은 데 따르는 의도된 대가입니다.
실제로 무엇을 해야 합니까?
먼저 신원 시드를 저장하십시오.
고가치 비밀을 맡길 만큼 신뢰하는 곳에 두십시오. 비밀번호 관리자, 오프라인 보안 장소, 또는 잃어서는 안 되는 것들에 적용하는 본인만의 방식 무엇이든 좋습니다. 그런 다음 일상적 편의를 위해 패스키를 추가하십시오.
평범한 사용에서는 이 조합이 강력한 균형을 이룹니다. 시드는 휴대 가능한 상태로 유지되고, 패스키는 매일의 접근을 매끄럽게 해 줍니다. 고위험 신원이라면 운영적 통제를 더하십시오 — 하드웨어 보안 키, 전용 기기, 그리고 민감한 작업 전용으로 따로 둔 별도의 신원입니다.
한 가지 더 분명히 해 둘 점이 있습니다. 분실된 시드(남은 잠금 해제 인자가 하나도 없는 경우)는 그 신원의 미래 사용이 사라졌음을 뜻하지만, 그 증명은 여전히 검증됩니다. 탈취된 시드는 신원 전체의 손상이며, 그 대응은 새 신원을 만들고 기존 신원을 비활성화하는 것입니다 — 재설정할 비밀번호가 애초에 없으므로, 비밀번호 재설정은 결코 아닙니다.
요약
CardanoWall은 평문 신원 시드가 아니라 암호화된 볼트 암호문을 저장합니다.
시드가 곧 신원입니다. 패스키가 암호화된 볼트를 잠금 해제합니다. 브라우저는 잠금 해제 후에만 비공개 키를 사용하고, 잠금 시 이를 지웁니다. 서버는 게시, 동기화, 그리고 편리한 접근 복구를 도울 수 있지만 — 설계상 사용자의 신원을 읽거나 다시 만들 수는 없습니다.
시드를 저장하십시오. 패스키를 사용하십시오. 그 차이를 알아 두십시오.
더 읽을거리
- 신원은 곧 시드다 — 32바이트 시드가 무엇이며 왜 그것이 신원 전체인지.
- 패스키가 신원 볼트를 보호하는 방법 — 패스키 잠금, 그리고 동기화 키와 하드웨어 키 사이의 절충점.
- 브라우저 저장소와 세션 키 — 브라우저에 무엇이 얼마나 오래 머무는지, 그리고 웹 암호의 한계.
- CardanoWall이 볼 수 있는 것 — 서버 가시성의 전체 경계.
- Label 309 — CardanoWall이 구현하는 개방형 표준이며, 참조 코드는 github.com/cardanowall에 있습니다.