SIWE (Sign In With Ethereum)
SIWE 는 이더리움 블록체인 기반의 사용자 인증 방식. 사용자는 자신의 이더리움 지갑을 통해 웹 서비스나 앱에 로그인할 수 있으며, 이는 기존의 중앙화된 아이디 제공자 (IDP) 대신 자신이 소유한 암호화폐 지갑으로 신원을 증명하는 방식이다.
최근에 회사의 Dapp 에 SIWE 인증 서비스를 도입했다. SIWE 를 도입하면서 백엔드 개발자 분들과 약간의 논의가 있었는데 ‘인증 안해도 로그인 되는데 굳이 로그인을 해야하나?’ 라는 이유였다. 나는 여기서 제대로 답을 하지 못해 리서치 겸 글을 작성해본다.
Web2 에서의 인증
1. 비밀번호 기반 인증 (ID/PW)
- 사용자가 아이디와 비밀번호를 입력하면, 서버가 이를 데이터베이스와 대조하여 신원을 확인합니다.
- 가장 기본적이고 널리 사용되는 방식이지만, 비밀번호 유출·재사용 등으로 인한 보안 취약점이 존재합니다.
2. 세션 기반 인증
- 로그인 성공 시 서버가 세션을 생성하고, 세션 ID를 쿠키에 저장하여 클라이언트에 전달합니다.
- 사용자가 요청할 때마다 쿠키에 담긴 세션 ID로 인증을 수행합니다.
- 세션 정보는 서버에 저장되며, 서버 확장 시 세션 동기화가 필요합니다.
3. 토큰 기반 인증 (JWT 등)
- 사용자가 로그인하면 서버가 JWT(JSON Web Token) 등 서명된 토큰을 발급합니다.
- 클라이언트는 이후 요청에 이 토큰을 포함시켜 서버에 제출하며, 서버는 토큰의 유효성을 검증해 인증을 처리합니다.
- 토큰은 클라이언트가 직접 저장·관리하며, 서버는 상태를 유지하지 않아 확장성이 높습니다.
4. OAuth 2.0 (소셜 로그인 등)
- Google, Facebook, Kakao 등 외부 서비스 계정으로 로그인할 수 있게 해주는 표준 프로토콜입니다.
- 대표적인 인증 방식:
- Authorization Code Grant: 서버 사이드에서 인증, 보안성이 높아 가장 많이 사용됨
- Implicit Grant: 클라이언트(브라우저)에서 직접 토큰을 받는 방식, 보안상 현재는 거의 사용하지 않음
- Resource Owner Password Credentials Grant: 신뢰 관계가 있는 앱에서만 사용
- Client Credentials Grant: 서버-서버 간 인증.
- 사용자는 외부 서비스의 로그인 페이지에서 인증을 마치고, 서비스는 액세스 토큰을 받아 인증에 활용합니다.
5. 2단계 인증(2FA), 생체 인증, 인증서 기반 인증
- 2단계 인증(2FA): 비밀번호 외에 일회용 코드(OTP), SMS, 이메일 인증 등 추가 인증을 요구.
- 생체 인증: 지문, 얼굴 인식 등으로 인증.
- 인증서 기반 인증: 공인인증서, 사설 인증서 등 디지털 인증서를 활용.
이처럼 Web2에서는 비밀번호, 세션, 토큰, OAuth, 2FA 등 다양한 인증 방식이 사용되며, 서비스의 특성과 보안 요구 수준에 따라 여러 방식을 조합해 적용하는 것이 일반적입니다.
Web3 에서의 SIWE 인증
- 라이브러리 혹은 지갑 연결
- 라이브러리에서 제공하는 연결 혹은 injected 된 지갑을 통해 로그인
- SIWE 서명 프로세스 시작
- 서버에서 nonce , message, expired, 로그인 목적 등 생성 후 전송
- SIWE message 생성 후 사용자에게 출력
- 메시지 서명
service.org wants you to sign in with your Ethereum account: 0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2 I accept the ServiceOrg Terms of Service: https://service.org/tos URI: https://service.org/login Version: 1 Chain ID: 1 Nonce: 32891756 Issued At: 2021-09-30T16:25:24Z Resources: - ipfs://bafybeiemxf5abjwjbikoz4mc3a3dla6ual3jsgpdr4cjr3oz3evfyavhwq/ - https://example.com/my-web2-claim.json
- 서명 데이터 서버에 전달
- 서명 검증
- 인증 완료 및 세션 발급
이 프로세스만 봐서는 SIWE 를 써야하는 이유를 모를 수 있다. 쓰지 않았을 때의 문제점을 알아보자.
Why SIWE?
- 지갑 소유권 검증 부재
- 단순히 지갑 주소 제출 및 연결하는 방식은 해당 주소의 실제 소유자를 검증 못함.
- 누군가 공개된 이더리움 주소를 임의로 입력하거나, 다른 사용자의 주소를 도용해 서비스에 접근할 수 있음.
- 서버에서는 사용자가 누구인지 확인할 방법이 없어, 주소만 알면 누구나 그 사용자인 척할 수 있는 심각한 보안 취약점.
- 세션 하이재킹 및 신원 도용
- SIWE 는 서명 메시지에 nonce (임의의 난수) 와 세션 정보를 포함시켜, 재사용 공격이나 세션 하이재킹을 방지
- 재사용 공격(Relay Attack)
- 이미 생성된 서명을 재사용해 인증을 우회
- 세션 하이재킹
- nonce 관리가 제대로 이뤄지지 않아, 사용자가 로그아웃해도 동일한 서명 메시지로 재로그인이 가능
- 재사용 공격(Relay Attack)
- SIWE 없이 단순히 주소를 전달할 경우, 이전에 사용된 정보가 그대로 재사용 가능
- SIWE 는 서명 메시지에 nonce (임의의 난수) 와 세션 정보를 포함시켜, 재사용 공격이나 세션 하이재킹을 방지
- 백엔드 API 보호 미흡
- 백엔드 API 호출 시 신원 검증이 어려움
- 누군가가 임의의 주소로 API 를 호출하면, 서비스는 잘못 인식할 수 있음.
다른 방법은 없나?
SIWE 말고도 사용자의 신원을 파악하는 블록체인 기술은 여러가지가 있다.
- DID (분산신원 인증)
- W3C DID 표준을 기반, 블록체인에 등록된 분산 신원(DID) 과 검증가능 자격증명 (VC) 를 활용해 자신을 증명
- 모바일 운전면허증
- NFT/토큰 소유 기반 인증
- 특정 NFT , 토큰을 소유한 지갑만 서비스 접근 가능
- 다중 인증 (MFA)
- 지갑 인증 외에 이메일, SMS, 생체 인증 등 추가인증 결합
- 소셜 로그인 연동형 Web3 인증
- 소셜 로그인 시 생기는 지갑을 연결 및 인증
- Wepin, Appkit 소셜 로그인
'BlockChain > Web3' 카테고리의 다른 글
[2] Web3 프론트엔드 연결 요약 (Wagmi + Reown) (0) | 2025.04.12 |
---|---|
[1] Frontend in Web3 (0) | 2025.04.06 |