Spring Boot에서의 OpenDID 인증

MONA·2025년 5월 21일

나혼공

목록 보기
69/92

Spring Boot에서 Open DID 기반으로 회원가입/로그인을 구현하기 위해서는 ID/PW 방식이 아닌 DID + Verifiable Credential(VC) 기반의 인증 흐름을 따라야 함

기본 개념

  • DID: 사용자의 탈중앙 식별자(예: did:ethr:0x1234...)
  • VC: 사용자의 신원을 증명하는 디지털 자격 증명
  • eWallet: 사용자가 자신의 DID와 VC를 보관하는 지갑
  • Verifier: Spring Boot 서버가 사용자로부터 VC를 받아 검증하는 역할
  • OpenDID: 특정 네트워크나 벤더에 종속되지 않고, 다양한 DID method를 허용하는 DID 구현 방식

전체 흐름

요약

[사용자 eWallet]  →  [Spring Boot 서버]

 1. DID 생성 및 VC 발급  ← (외부 Issuer)
 2. VC 제출 (로그인/회원가입 요청 시)
 3. Spring Boot 서버에서 VC 검증
 4. 검증 성공 시 세션/토큰 발급

디테일

  1. DID 및 VC 발급(사전단계)
  • 사용자는 DID Wallet App 또는 웹 서비스에서 DID를 생성하고, 발급자(issuer)로부터 VC를 받음
  1. 회원가입 요청(Spring Boot)

User side(FE)

  • eWallet 또는 연동된 DApp에서 사용자의 VC를 선택하고 서버로 제출
  • 제출 방식: POST/singup 요청에 VC를 JSON 형태로 포함
POST /signup
{
  "did": "did:ethr:0xabc123...",
  "vc": { ... } // W3C 표준 VC JSON
}

Server side(BE)

  • DID 검증을 위한 라이브러리 활용
  • ex) did-jwt, DIDKit, veramo, Trinsic, Affinidi SDK 등과 연동
// VC 검증 → did 문서 조회 → 서명자 공개키 일치 여부 확인
boolean isVerified = vcVerifier.verify(vcJson);

if (isVerified) {
    // 회원 등록
    userRepository.save(new User(did, name, ...));
}
  1. 로그인 요청
  • 사용자가 로그인 시 VC 또는 VP(Verifiable Presentation)를 제출
  • 서버는 이를 검증하여 신원을 확인하고, 자체 JWT 등을 발급
POST /login
{
  "vp": {
    "presentation": {...},
    "proof": {...}
  }
}
  • 서버가 검증 후 내부 사용자와 매핑
String did = extractDidFromVp(vpJson);
User user = userRepository.findByDid(did);

Spring Boot + Node 중계 구조

[DApp] → [Spring Boot API] → [Node.js VC/DID 검증 서버] → [DID Resolver] → [블록체인]
  • Node.js에서 검증 후 Spring Boot에 검증 결과만 전달

보안 고려사항

  • VC 위조 방지: 서명 검증을 철저히 해야 함
  • 만료, 철회 여부 확인: VC의 expirationDate, status 필드 체크
  • DID 문서 캐시: DID Resolver 결과 캐싱
  • HTTPS 강제, CSRF 보호: 전송 중 데이터 안전을 위함

결론

OpenDID 기반 로그인

  • DID를 사용자 식별자로 삼고, 사용자가 소유한 VC 또는 VP를 제출하여 인증하는 구조
  • Spring Bootsms Verifier 역할, 이를 검증하고 세션 또는 JWT를 발급하는 로직을 담당함.
profile
고민고민고민

0개의 댓글