월렛은 새로운 Auth 레이어다
Source: Dev.to
Introduction
Web2에서 인증을 구현해 본 적이 있다면, Web3 지갑도 낯설게 느껴지지 않을 것입니다.
인증은 언제나 한 가지에 관한 것이었습니다: 이 사용자가 특정 아이덴티티에 대한 제어권을 증명할 수 있는가? Web3는 질문 자체를 바꾸지는 않으며, 단지 증명을 누가 저장하느냐만 바꿉니다.
PS: Stateful는 애플리케이션이 과거 상호작용에서 얻은 정보(‘상태’)를 기억하고, 그 컨텍스트를 사용해 새로운 요청을 처리한다는 의미입니다.
Web2 Authentication Overview
Identity on the Server
Web2에서는 아이덴티티가 여러분의 서버에 존재합니다.
Typical login flow
- 사용자가 이메일과 비밀번호를 제출합니다.
- 백엔드가 저장된 자격 증명과 대조해 검증합니다.
- 세션 또는 JWT가 발급됩니다.
OAuth Flow
OAuth도 같은 구조를 따릅니다:
- Google, GitHub 등에서 아이덴티티를 주장합니다.
- 여러분의 시스템은 제3자를 진실의 출처로 신뢰합니다.
이 모델들은 세 가지 구조적 특성을 만듭니다:
- 비밀을 저장해야 함
- 아이덴티티가 플랫폼에 종속됨
- 백엔드가 보호와 복구를 담당함
대부분의 Web2 인증 문제는 실수가 아니라 이 모델의 결과입니다.
Wallet‑Based Authentication
Wallet‑based 인증은 아키텍처를 뒤집습니다:
- 비밀번호 없음.
- 자격 증명 데이터베이스 없음.
- 외부 아이덴티티 제공자 없음.
지갑은 단순히 키 쌍입니다:
| Component | Role |
|---|---|
| Public key (address) | 사용자 식별자 |
| Private key | 제어권 증명 |
인증은 데이터 서명을 통해 이루어지며, 비밀을 제출하는 것이 아닙니다.
Exact Flow (Web2‑friendly terms)
- Server가 무작위 챌린지(논스)를 생성합니다.
- Client가 지갑에 논스를 서명하도록 요청합니다.
- Server가 지갑 주소를 사용해 서명을 검증합니다.
- 검증에 성공하면 사용자가 인증됩니다.
이는 SSH에서 사용되는 공개키 인증과 동일한 모델입니다.
Example Code (JavaScript)
// server
const nonce = generateRandomNonce();
storeNonce(address, nonce);
// client
const signature = wallet.signMessage(nonce);
// server
const isValid = verifySignature({
address,
nonce,
signature
});
if (isValid) {
authenticateUser(address);
}
비밀번호 비교도, 저장된 비밀도 없습니다—오직 암호학적 검증만 존재합니다.
Implications of Decentralized Auth
- 사용자가 자신의 아이덴티티를 소유
- 플랫폼이 조용히 접근을 취소할 수 없음
- 하나의 아이덴티티가 여러 애플리케이션에서 사용 가능
- 백엔드는 더 이상 인증을 제어하지 않으며, 단지 수학적 검증만 수행합니다.
Limitations & What Still Needs to Be Handled
지갑이 인증을 해결해 주지만, 다음을 해결하지는 않습니다:
- 권한 부여(Authorization)
- 사용자 프로필 관리
- 키 분실 방지
여전히 구현해야 할 것들:
- 역할 관리
- 권한(Permissions)
- 애플리케이션 수준의 사용자 데이터
지갑은 로그인 시스템을 대체할 뿐, 더 넓은 애플리케이션 로직을 대체하지는 않습니다.
Conclusion
지갑을 서버가 아닌 사용자를 위한 SSH 키라고 생각해 보세요.
이렇게 보면, 지갑 기반 인증은 이국적인 것이 아니라 아이덴티티 시스템의 자연스러운 진화로 보일 것입니다.