키 관리
키 관리는 보안에서 매우 중요한 요소입니다. 다만 키를 얼마나 안전하게 관리할 수 있는지는 플랫폼에 따라 달라집니다. 예를 들어 로컬 keystore/keychain에 접근할 수 있는 모바일 앱은 웹 브라우저보다 훨씬 더 안전합니다.현재 클라이언트 측 키 관리는 웹 환경에서 이루어집니다. 이러한 제약 속에서도 브라우저에서는 적절한 보안 조치를 취하고 있습니다.
임시 keypair는 암호화되어 브라우저 내 데이터베이스인 IndexedDB를 사용해 사용자의 브라우저에 안전하게 저장됩니다. 사용자가 트랜잭션 서명이나 전송 같은 작업을 시작하면 세션 토큰이 이 임시 keypair로 트랜잭션에 서명합니다. 그러면 스마트 컨트랙트가 해당 트랜잭션을 검증해 사용자의 지갑이 세션 토큰을 승인했는지 확인할 수 있습니다.\
web3.Keypair.generate()를 사용해 무작위 keypair를 생성합니다- 무작위 암호화 키를 생성합니다
- 해당 암호화 키로 생성된 keypair를 암호화합니다
- 암호화된 키를 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과 상호작용합니다. 현재의 제약을 감안하면, 우리는 이에 맞춰 설계하고 다른 방식으로 이를 강화해야 합니다.- 임시 signer로 가능한 범위를 대폭 줄여 매우 문맥 의존적이고 사용 사례에 특화되도록 합니다.
- 이는 web2의 전형적인 클라이언트-서버 아키텍처에서 JWT를 다루는 방식과 유사합니다.
- 예를 들어 Facebook, Twitter, 심지어 은행 웹사이트의 session 또는 JWT token도 같은 문제에 노출될 수 있습니다. 이들이 대응하는 방식은 token으로 할 수 있는 범위를 제한하고, 지능형 철회 시스템을 두며, 의심스러운 활동에는 추가로 2FA를 도입하는 것입니다.
- 우리도 비슷한 모델로 범위를 제한하고 있으며, 범위 밖 사용 같은 악성 트랜잭션이 감지되면 손상된 token을 즉시 철회할 수 있는 지능형 revocation system을 추가하는 작업도 진행 중입니다. 자금 손실 관점에서 절대적인 최악의 경우는 가스비를 위해 top up된 0.01 SOL입니다.
- 또한 개발자는 지금도 octane 같은 gasless relay와 함께 사용하고
topUp을false로 설정해 이를 우회할 수 있습니다. 다만 SDK에서 이를 직접 매끄럽게 처리하는 방법은 아직 없고, 로드맵에 포함되어 있습니다.

