NIP-07은 브라우저 확장 프로그램이 웹 기반 Nostr 클라이언트에 서명 기능을 제공하기 위한 표준 인터페이스를 정의한다. 개인 키를 웹사이트에 노출하지 않고 확장 프로그램 내에서 안전하게 보관한다.

작동 방식

브라우저 확장 프로그램이 window.nostr 객체를 주입하면 웹 앱이 이를 사용할 수 있다:

// 공개 키 가져오기
const pubkey = await window.nostr.getPublicKey();

// 이벤트 서명
const signedEvent = await window.nostr.signEvent(unsignedEvent);

// 암호화 (NIP-04, 레거시)
const ciphertext = await window.nostr.nip04.encrypt(pubkey, plaintext);

// 복호화 (NIP-04, 레거시)
const plaintext = await window.nostr.nip04.decrypt(pubkey, ciphertext);

// NIP-44 메서드 (최신, 지원되는 경우)
// const ciphertext = await window.nostr.nip44.encrypt(pubkey, plaintext);
// const plaintext = await window.nostr.nip44.decrypt(pubkey, ciphertext);

보안 모델

  • 키 격리: 개인 키가 확장 프로그램 밖으로 나가지 않는다
  • 사용자 승인: 확장 프로그램이 각 서명 요청마다 승인을 요구할 수 있다
  • 도메인 제어: 확장 프로그램이 서명을 요청할 수 있는 사이트를 제한할 수 있다

NIP-07은 키 관리를 개선하지만, 확장 프로그램 자체에 대한 신뢰를 제거하지는 않는다. 악의적이거나 손상된 확장 프로그램은 잘못된 것에 서명하거나, 메타데이터를 유출하거나, 권한을 과도하게 부여할 수 있다.

상호운용성 참고사항

NIP-07에서 가장 어려운 부분은 API 형태가 아니라 기능 차이다. 일부 확장 프로그램은 getPublicKey()signEvent()만 지원한다. 다른 확장 프로그램은 nip04, nip44 또는 더 새로운 선택적 메서드도 제공한다. 웹 앱은 모든 주입된 서명자가 동일하게 동작한다고 가정하지 말고 기능 감지와 적절한 폴백을 구현해야 한다.

사용자 승인 UX도 동작을 변화시킨다. 백그라운드 접근을 자동으로 기대하는 사이트는 한 확장 프로그램에서는 잘 작동하지만 모든 요청마다 승인을 요구하는 다른 확장 프로그램에서는 고장난 것처럼 느껴질 수 있다. 좋은 NIP-07 앱은 서명을 대화형 권한 경계로 취급한다.

구현 현황

주요 NIP-07 확장 프로그램:

  • Alby - Nostr 서명 기능이 포함된 Lightning 지갑
  • nos2x - 경량 Nostr 서명자
  • Flamingo - 기능이 풍부한 Nostr 확장 프로그램

한계

  • 브라우저 전용 (모바일 미지원)
  • 확장 프로그램 설치 필요
  • 확장 프로그램마다 승인 UX가 다름

기기 간 또는 모바일 서명에는 NIP-46과 NIP-55가 더 적합하다.


주요 출처:

언급된 뉴스레터:

같이 보기: