메인 콘텐츠로 건너뛰기

키 관리

키 관리는 보안에서 매우 중요한 요소입니다. 다만 키를 얼마나 안전하게 관리할 수 있는지는 플랫폼에 따라 달라집니다. 예를 들어 로컬 keystore/keychain에 접근할 수 있는 모바일 앱은 웹 브라우저보다 훨씬 더 안전합니다.

현재 클라이언트 측 키 관리는 웹 환경에서 이루어집니다. 이러한 제약 속에서도 브라우저에서는 적절한 보안 조치를 취하고 있습니다.
임시 keypair는 암호화되어 브라우저 내 데이터베이스인 IndexedDB를 사용해 사용자의 브라우저에 안전하게 저장됩니다. 사용자가 트랜잭션 서명이나 전송 같은 작업을 시작하면 세션 토큰이 이 임시 keypair로 트랜잭션에 서명합니다. 그러면 스마트 컨트랙트가 해당 트랜잭션을 검증해 사용자의 지갑이 세션 토큰을 승인했는지 확인할 수 있습니다.\
  1. web3.Keypair.generate()를 사용해 무작위 keypair를 생성합니다
  2. 무작위 암호화 키를 생성합니다
  3. 해당 암호화 키로 생성된 keypair를 암호화합니다
  4. 암호화된 키를 IndexedDB에 저장합니다

보안 모델

1. Session keys는 web3에 맞게 적용된 JWT Token과 비슷합니다 2. 이 키에는 만료 시간과 scope가 있습니다 3. 키가 만료되면 대상 프로그램에서 다시 사용할 수 없으며 새 세션 토큰을 생성해야 합니다. 4. 또한 취소 가능하도록 설계되어 있어, 최악의 경우 문제가 발생하더라도 공격 범위는 임시 keypair와 그 안에 들어 있는 자산, 즉 0.01 SOL로 제한됩니다

IndexedDB 관련 참고

웹 브라우저는 매우 적대적인 환경이며, cookie, session, 확장 프로그램 sandbox에 이르기까지 어떤 보안 조치도 완전하다고 볼 수 없습니다. 공격자는 XSS나 악성 확장 프로그램을 통해 언제든 임의 코드를 주입할 수 있습니다. 그래서 사용자가 브라우저 지갑에 큰 자금을 보관하는 것은 권장되지 않으며, 이런 지갑은 일상적인 소액 사용에 적합합니다. 그리고 Session Keys는 burner wallet이 아니라는 점을 분명히 구분해야 합니다. 그럼에도 오늘날 web3의 대부분은 웹 브라우저 위에서 돌아가고 있으며, 사용자도 주로 브라우저를 통해 다른 dApp과 상호작용합니다. 현재의 제약을 감안하면, 우리는 이에 맞춰 설계하고 다른 방식으로 이를 강화해야 합니다.
  1. 임시 signer로 가능한 범위를 대폭 줄여 매우 문맥 의존적이고 사용 사례에 특화되도록 합니다.
  2. 이는 web2의 전형적인 클라이언트-서버 아키텍처에서 JWT를 다루는 방식과 유사합니다.
  3. 예를 들어 Facebook, Twitter, 심지어 은행 웹사이트의 session 또는 JWT token도 같은 문제에 노출될 수 있습니다. 이들이 대응하는 방식은 token으로 할 수 있는 범위를 제한하고, 지능형 철회 시스템을 두며, 의심스러운 활동에는 추가로 2FA를 도입하는 것입니다.
  4. 우리도 비슷한 모델로 범위를 제한하고 있으며, 범위 밖 사용 같은 악성 트랜잭션이 감지되면 손상된 token을 즉시 철회할 수 있는 지능형 revocation system을 추가하는 작업도 진행 중입니다. 자금 손실 관점에서 절대적인 최악의 경우는 가스비를 위해 top up된 0.01 SOL입니다.
  5. 또한 개발자는 지금도 octane 같은 gasless relay와 함께 사용하고 topUpfalse로 설정해 이를 우회할 수 있습니다. 다만 SDK에서 이를 직접 매끄럽게 처리하는 방법은 아직 없고, 로드맵에 포함되어 있습니다.