본문 바로가기
BlockChain

DID 스터디 1회차

by ybs 2023. 1. 28.
반응형

1. SSI(Self Sovereign Identity)  와 DID(Decentralized Identifier)

SSI 에 대해 설명하기전에 먼저 기존 ID 시스템에 대해 설명하려한다.

 

1세대: 서비스마다 각자 ID 관리

 

2세대: SSO(Single Sign On) 페이스북인증, 구글인증

 

0. 페이스북의 개발자 포털에 접속하여, 페이스북 인증을 사용하고자 하는 애플리케이션 정보를 등록한다(서비스명, 서비스 URL, 그리고 인증이 성공했을 때 인증 성공 정보를 받을 콜백 URL) 그리고 Client ID와 Client Secret을 발급받는다.
 
1. 사용자가 웹 브라우저에서 Client Application(페이스북 로그인 기능 사용)을 이용하려고 요청한다.
 
2. Client Application 은 사용자 인증이 되지 않았기 때문에 페이스북 로그인 페이지 URL을 HTTP 리다이렉션으로 브라우저에 보낸다. 그 URL로 페이스북에 3번 로그인 요청이 Client Application 에 대한 사용자 인증 요청임을 알려주고자, Client ID, Client Secret 등의 추가 정보와 함께 페이스북 정보 접근 권한(사용자 정보, 그룹 정보 등)을 scope 라는 필드를 통해서 요청한다.
 
3. 브라우저는 페이스북 로그인 페이지로 이동하여 2단계에서 받은 추가적인 정보와 함께 로그인을 요청한다.
 
4. 페이스북은 사용자에게 로그인 창을 보낸다.
 
5. 사용자는 로그인 창에 ID/PW 를 입력한다.
 
6. 페이스북은 사용자를 인증하고 인증 관련 정보와 함께 브라우저로 다시 전달하면서 Client Application 로그인 완료 페이지로 리다이렉션 한다.
 
7. Client Application 은 6번에서 온 인증 관련 정보를 받는다.
 
8. Client Application 은 이 정보를 가지고 페이스북에 사용자가 제대로 인증을 받은 사용자인지 문의한다.
 
9. 페이스북은 해당 정보를 보고 제대로 인증된 사용자임을 확인해주고 Access Token을 발급한다.
 
10. Client Application 은 9번에서 받은 Access Token 으로 페이스북 API 서비스에 접근한다.

 

3세대: SSI(Self Sovereign Identity) 자기 주권 신원증명

개인정보가 본인에게 있음.

SSI 기술의 DID 를 사용(식별자와 인증 수단으로 사용됨).

자기주권 신원증명 구조 분석서(윤대근 저)

1. VC

-  사용자가 발행기관으로부터 발급받은 신분증, 졸업증명서, 재직증명서 등과 같은 신원증명을 의미

- 보관용 ID 로 사용되는 VC(Verifiable Credential, 검증 가능한 자격증명)

- 사용자는 VC 를 직접 사용하지 않음

 

2. VP 

- 사용자는 발급받은 VC 의 필요한 속성만을 추출하여 VP로 가공

- 제출용 ID 로 사용되는 VP(Verifiable Presentation, 검증 가능한 제공 ID 데이터 집합)

 

3. Issuer

- VC 를 발행하는 발행기관

 

4. Holder

- 사용자를 뜻함. VC 를 발급받은 후 VP 로 가공하여 검증기관에 제출함

 

5. Verifier

- 사용자로부터 VP를 수신하여 VP의 진위를 검증하는 검증기관

 

2. Hyperledger Aries 와 Hyperledger indy

자기주권 신원증명 구조 분석서(윤대근 저)

Hyperledger Aries : 블록체인, 분산저장소와는 독립적으로 클라이언트 애플리케이션 간 SSI 관련 데이터를 처리하기 위한 P2P 프로토콜 개발

Hyperledger/indy-sdk : indy-node 와 연동하는 클라이언트(발행기관, 사용자, 검증기관 등) 애플리케이션 개발용 SDK 개발

Hyperledger/indy-node : SSI 플랫폼에 특화된 블록체인 노드 개발
Hyperledger/indy-plenum : indy-node 의 합의 알고리즘 개발

cf) Hyperledger Aries 는 Hyperledger Indy 와 독립적인 프로젝트다. Hyperledger Aries 목표는 어떤 블록체인, 분산저장소를 사용하든 상관없이 독립적으로 동작할 수 있는 클라이언트 간 SSI 통신 표준과 프레임워크를 개발한다.

 

cf) indy-sdk 만으로 개발은 다 가능하다. Aries 는 나중에 생겼다(더 편의성을 위함).

 

3. 다음 계획

다음계획 수정(2023.02.19 기준) : nodejs did 분석 및 안드로이드 kotlin 개발

 

https://github.com/hyperledger/aries-framework-swift

import XCTest
@testable import AriesFramework

class ConnectionTest: XCTestCase {
    var faberAgent: Agent!
    var aliceAgent: Agent!

    override func setUp() async throws {
        try await super.setUp()

        let faberConfig = try TestHelper.getBaseConfig(name: "faber")
        let aliceConfig = try TestHelper.getBaseConfig(name: "alice")

        faberAgent = Agent(agentConfig: faberConfig, agentDelegate: nil)
        aliceAgent = Agent(agentConfig: aliceConfig, agentDelegate: nil)

        faberAgent.setOutboundTransport(SubjectOutboundTransport(subject: aliceAgent))
        aliceAgent.setOutboundTransport(SubjectOutboundTransport(subject: faberAgent))

        try await faberAgent.initialize()
        try await aliceAgent.initialize()
    }

    override func tearDown() async throws {
        try await faberAgent.reset()
        try await aliceAgent.reset()
        try await super.tearDown()
    }

    // TODO: 여기서부터 분석 시작
    func testMultiUseInvite() async throws {
        let message = try await faberAgent.connections.createConnection(multiUseInvitation: true)
        // swiftlint:disable:next force_cast
        let invitation = message.payload as! ConnectionInvitationMessage
        let invitationUrl = try invitation.toUrl(domain: "https://example.com")

        var aliceFaberConnection1 = try await aliceAgent.connections.receiveInvitationFromUrl(invitationUrl)
        try await Task.sleep(nanoseconds: UInt64(0.1 * SECOND))
        aliceFaberConnection1 = try await aliceAgent.connectionRepository.getById(aliceFaberConnection1.id)
        XCTAssertEqual(aliceFaberConnection1.state, .Complete)

        var aliceFaberConnection2 = try await aliceAgent.connections.receiveInvitationFromUrl(invitationUrl)
        try await Task.sleep(nanoseconds: UInt64(0.1 * SECOND))
        aliceFaberConnection2 = try await aliceAgent.connectionRepository.getById(aliceFaberConnection2.id)
        XCTAssertEqual(aliceFaberConnection2.state, .Complete)

        let faberAliceConnection1 = try await faberAgent.connectionService.getByThreadId(aliceFaberConnection1.threadId!)
        let faberAliceConnection2 = try await faberAgent.connectionService.getByThreadId(aliceFaberConnection2.threadId!)

        XCTAssertEqual(TestHelper.isConnectedWith(received: faberAliceConnection1, connection: aliceFaberConnection1), true)
        XCTAssertEqual(TestHelper.isConnectedWith(received: faberAliceConnection2, connection: aliceFaberConnection2), true)
    }
}

https://github.com/hyperledger/aries-cloudagent-python/blob/main/aries_cloudagent/askar/store.py

 

참고: 자기주권 신원증명 구조 분석서(윤대근 저)

반응형