at:// URI를 가집니다.at:// URI가 주어졌을 때, 그에 해당하는 JSON을 어떻게 찾을 수 있을까요?at:// URI를 해석(Resolve)하는 정확한 과정을 단계별로 보여드리겠습니다. 알고 보니, 이것은 at://가 어떻게 작동하는지 세부 사항을 배우는 아주 좋은 방법이기도 합니다.https://), 권한(Authority) (예: wikipedia.com), 경로(Path, 예: /Main_Page), 그리고 쿼리(Query)를 포함합니다.https://를 포함한 대부분의 프로토콜에서 권한 부분은 데이터를 호스팅(Hosting)하는 주체를 가리킵니다. 이 데이터를 생성한 사람은 아예 나타나지 않거나 경로에 포함되어 있습니다.at:// 프로토콜은 이를 뒤집습니다.at:// URI에서 데이터를 생성한 사람이 가장 문자 그대로의 의미에서 권한(Authority)이 됩니다.at:// URI에 직접 포함되지 않습니다. 해당 JSON을 호스팅하는 실제 물리적 서버를 찾으려면 몇 가지 단계를 거쳐야 합니다.at:// URI가 나타내는 JSON 조각으로 해석해 봅시다.at:// URI를 해석하는 쉬운 방법은 SDK나 클라이언트 앱을 사용하는 것입니다. 예를 들어 pdsls, Taproot, 또는 atproto-browser 같은 온라인 클라이언트를 사용해 보세요. 이들은 해당 JSON이 현재 호스팅되고 있는 물리적 서버를 찾아내어 그 JSON을 보여줄 것입니다.at:// URI는 현재 호스팅되고 있는 위치에 상관없이 다음 JSON을 가리킵니다.$type 필드가 "app.bsky.feed.post"인 것을 보고 이것이 일종의 포스트(Post)임을 짐작할 수 있습니다(이것이 왜 text나 langs 같은 필드를 가지고 있는지 설명해 줍니다).$type은 데이터 *형식(Format)*을 명시한다고 생각할 수 있습니다. app.bsky.* 접두사는 bsky.app 애플리케이션이 이 데이터를 어떻게 처리해야 할지 알고 있을 것임을 알려줍니다. 다른 애플리케이션들도 이 형식의 데이터를 소비하거나 생성할 수 있습니다.uri 또한 at:// URI이지만, 우리가 처음에 요청했던 원래의 at:// URI와는 약간 다르다는 것을 눈치챘을 것입니다.ruuuuu.de 권한이 더 긴 did:web:iam.ruuuuu.de 권한으로 확장되었습니다. 혹시 이것이 물리적 호스트일까요?at:// URI를 해석하는 과정은 세 가지 뚜렷한 단계로 이루어집니다.at:// URI들은 핸들을 사용하기 때문에 취약합니다.ruuuuu.de, danabra.mov, tessa.germnetwork.com은 핸들입니다.at:// 핸들을 변경하기로 선택할 수 있으며, 이때 네트워크에 이미 존재하는 JSON 조각들 사이의 링크가 깨지지 않는 것이 중요합니다.at:// URI를 저장하기 전에, 핸들을 절대 변하지 않는 것인 아이덴티티로 해석하여 정규 형식(Canonical form)으로 변환해야 하는 이유입니다. 아이덴티티는 계정 ID와 같지만, 전역적이며 웹 전체를 위해 고안된 것입니다. 핸들을 아이덴티티(또는 "DID")로 해석하는 데는 두 가지 메커니즘이 있습니다._atproto.<handle>에서 did=???를 찾는 DNS TXT 레코드를 쿼리합니다.https://<handle>/.well-known/atproto-did로 HTTPS GET 요청을 보냅니다.did:something:whatever와 같은 형태를 가집니다. (이것이 무엇을 의미하는지는 나중에 다시 다루겠습니다.)ruuuuu.de를 해석해 봅시다.ruuuuu.de 핸들은 did:web:iam.ruuuuu.de에 의해 소유된다고 주장합니다. 이 시점에서 우리가 알고 싶었던 것은 이것이 전부입니다.did:web:iam.ruuuuu.de 아이덴티티를 제어하는 주체가 ruuuuu.de가 자신의 핸들이라는 것에 "동의"하는지 확인해야 합니다. 이 매핑은 양방향입니다. 하지만 이는 나중 단계에서 확인할 것입니다.danabra.mov를 해석해 봅시다.danabra.mov 핸들은 did:plc:fpruhuo22xkm5o7ttr2ktxdo 아이덴티티에 의해 소유된다고 주장합니다.barackobama.bsky.social과 같은 서브도메인도 핸들이 될 수 있습니다.barackobama.bsky.social 핸들이 did:plc:5c6cw3veuqruljoy5ahzerfx 아이덴티티에 의해 소유된다고 주장함을 의미합니다.at:// 링크들은 사람이 읽기 쉽지만 취약합니다.at:// 링크들은 우리가 계정을 삭제하거나, 레코드를 삭제하거나, 호스팅을 영구적으로 중단하지 않는 한 깨지지 않습니다.at:// URI의 "진정한 형태"입니다.at:// 링크를 "퍼머링크(Permalinks)"라고 생각하세요. at:// URI를 저장하는 모든 애플리케이션은 우리가 핸들을 바꾸거나 호스팅을 바꿔도 JSON 조각들 사이의 논리적 링크가 깨지지 않도록 이 정규 형식으로 저장해야 합니다.did:webruuuuu.de 핸들은 did:web:iam.ruuuuu.de에 의해 소유된다고 주장합니다.did:web: 부분을 잘라내고 끝에 /.well-known/did.json을 붙인 뒤 HTTPS GET 요청을 실행하면 됩니다.alsoKnownAs 필드는 did:web:iam.ruuuuu.de를 제어하는 주체가 실제로 @ruuuuu.de를 핸들로 사용하고 싶어 함을 확인해 줍니다. ✅publicKeyMultibase 필드는 그들의 데이터에 대한 모든 변경 사항이 서명되는 공개 키를 알려줍니다.serviceEndpoint 필드는 그들의 데이터가 있는 실제 서버를 알려줍니다. Rudy의 데이터는 현재 https://blacksky.app에 호스팅되어 있습니다.@ruuuuu.de와 상호작용하는 사용자들은 그의 DID나 현재 호스팅(그리고 그것이 이동하는지 여부)에 대해 알거나 신경 쓸 필요가 없습니다. 그들의 관점에서는 그의 현재 핸들이 유일하게 유효한 식별자입니다. 개발자의 경우, 편리하게도 절대 변하지 않는 DID로 그를 참조하게 됩니다.did:web 아이덴티티에는 한 가지 큰 단점이 있습니다. 만약 did:web:iam.ruuuuu.de가 iam.ruuuuu.de 도메인에 대한 제어권을 잃게 되면, 그는 자신의 DID 문서에 대한 제어권을 잃게 되고, 결과적으로 자신의 아이덴티티 전체를 잃게 됩니다.did:web의 대안을 살펴봅시다.did:plcdanabra.mov 핸들이 did:plc:fpruhuo22xkm5o7ttr2ktxdo 아이덴티티(사실 저입니다!)에 의해 소유된다고 주장한다는 것을 알고 있습니다.did:plc:fpruhuo22xkm5o7ttr2ktxdo에 대한 DID 문서를 찾아봅시다.https://plc.directory 서비스에 GET 요청을 보내야 합니다.alsoKnownAs 필드는 did:plc:fpruhuo22xkm5o7ttr2ktxdo를 제어하는 주체가 @danabra.mov를 핸들로 사용함을 확인해 줍니다. ✅publicKeyMultibase 필드는 내 데이터의 모든 변경 사항이 서명되는 공개 키를 알려줍니다.serviceEndpoint 필드는 내 데이터가 있는 실제 서버를 알려줍니다. 현재 https://morel.us-east.host.bsky.network에 있습니다.@danabra.mov이지만, 제 데이터를 실제로 저장하고 있는 서버는 현재 https://morel.us-east.host.bsky.network입니다. 저는 그곳에 계속 호스팅하는 것에 만족하지만, 나중에는 제가 직접 제어하는 호스트로 옮길 생각도 있습니다. 저는 소셜 앱에 지장을 주지 않으면서 제 핸들과 호스팅을 모두 변경할 수 있습니다.did:web 아이덴티티를 가진 Rudy와 달리, 저는 웹 도메인에 저 자신을 돌이킬 수 없게 묶어두지 않기 위해 did:plc(Bluesky에서 계정을 만들 때 기본값)를 고수했습니다. "PLC"는 공식적으로 "Public Ledger of Credentials(공개 자격 증명 원장)"의 약자입니다. 기본적으로 DID 문서를 위한 npm 레지스트리와 같습니다. (재미있는 사실: 원래 PLC는 "placeholder(자리 표시자)"를 의미했지만, 그들은 이것이 좋은 절충안이라고 결정했습니다.)did:plc 아이덴티티의 장점은 도메인 갱신을 잊어버리거나 TLD의 최상위 레벨에서 나쁜 일이 발생하더라도 제 아이덴티티를 잃지 않는다는 것입니다.did:plc 아이덴티티의 단점은 PLC 레지스트리를 운영하는 주체가 제 아이덴티티에 대해 어느 정도의 통제권을 갖는다는 것입니다. 모든 버전이 이전 버전의 해시로 재귀적으로 서명되고, 모든 과거 버전을 조회할 수 있으며, 초기 버전의 해시가 DID 자체이기 때문에 그들이 제 아이덴티티를 완전히 바꿀 수는 없습니다.at:// URI를 통해 JSON을 가져오기에 충분합니다!serviceEndpoint가 포함되어 있습니다. 그것이 바로 해당 주체가 저장하는 모든 JSON 레코드를 가져오기 위해 HTTPS로 접속할 수 있는 서비스입니다.@ruuuuu.de 핸들은 did:web:iam.ruuuuu.de로 해석되고, 그 DID 문서의 serviceEndpoint는 https://blacksky.app을 가리킵니다.at://ruuuuu.de/app.bsky.feed.post/3lzy2ji4nms2z 레코드를 가져오려면, at:// URI의 각 부분을 파라미터로 전달하여 https://blacksky.app 서버의 com.atproto.repo.getRecord 엔드포인트에 접속하면 됩니다.@danabra.mov 핸들은 did:plc:fpruhuo22xkm5o7ttr2ktxdo로 해석됩니다.did:plc:fpruhuo22xkm5o7ttr2ktxdo의 DID 문서는 현재 호스팅으로 https://morel.us-east.host.bsky.network를 가리킵니다.at:// URI를 해석하는 방법입니다.at:// URI를 해석하려면 다음 세 단계를 따라야 합니다.getRecord 호출).at:// URI를 해석하거나 JSON 레코드를 로드할 필요가 없습니다. 그런 방식을 사용하더라도 at:// URI를 사용자가 생성한 데이터의 고유 식별자로 계속 사용하게 되지만, 데이터 자체는 여러분이 가져오는(Pull) 것이 아니라 여러분에게 밀려 들어오는(Push) 방식이 됩니다. 그럼에도 불구하고 필요할 때 데이터를 가져올 수 있다는 사실을 아는 것은 유용합니다.at://가 어디에 있는지 알게 되었습니다.아직 댓글이 없습니다.
첫 번째 댓글을 작성해보세요!

React Compiler의 소리 없는 실패 (그리고 해결 방법)
Inkyu Oh • Front-End

GraphQL: 엔터프라이즈의 허니문은 끝났다
Inkyu Oh • Back-End