π βConnect Walletβ λ²νΌμ΄ λ΄ μ 체 μΈμ¦ μμ€ν μ λ체νλ€
μΆμ²: Dev.to
μλΌλμμ κ°λ°μ μμνλ©΄μ μμμΉ λͺ»νλ κ²μ΄ νλ μλ€: λλ νμκ°μ νΌμ ν λ²λ μμ±νμ§ μμλ€.
μ¬μ©μλͺ νλλ μκ³ , λΉλ°λ²νΈ κ²μ¦λ μμΌλ©°, βμ΄λ©μΌ νμΈβ νλ¦λ μκ³ , βλΉλ°λ²νΈ μ°ΎκΈ°β νμ΄μ§λ μλ€. μΉ2μμ μμ λ²μ© λ§λ€λ λͺ¨λ μΈμ¦ μΈνλΌκ° μ¬λΌμ‘λ€.
κ·Έ μ리λ₯Ό μ°¨μ§ν κ²μ λ¨ νλμ λ²νΌ. βμ§κ° μ°κ²°β.
π§ μ§κ°μ΄ μ€μ λ‘ νλ μΌ
μλΌλκ° μ²μμ΄λΌλ©΄, μ΄μ κΈμμ μ¬μ©μλͺ μμ ν€νμ΄λ‘μ κ°λ μ μ νμ λν΄ λ€λ€λ€.
μμ½νλ©΄: λΉμ μ μ 체μ±μ λ°μ΄ν°λ² μ΄μ€ νμ΄ μλλΌ μνΈνλ ν€νμ΄μ΄λ€.
μΈμ¦ κ΄λ¦¬λ λΉμ μ΄ νμ§ μλλ€. μ§κ°μ΄ λμ νλ€. μ¬μ©μκ° Connect Walletμ ν΄λ¦νλ©΄, λΈλΌμ°μ νμ₯(Phantom, Solflare λ±)μ΄ νμΈ μ°½μ λμ΄λ€. μ¬μ©μκ° μΉμΈνλ©΄, λΉμ μ μ±μ κ·Έλ€μ 곡κ°ν€λ₯Ό λ°λλ€. λΉμ μ μ λ κ°μΈν€λ₯Ό λ³΄μ§ λͺ»νκ³ , λΉλ°λ²νΈ ν΄μλ₯Ό μ μ₯νκ±°λ μΈμ ν ν°μ λ°ννμ§ μλλ€.
μ¨λ³΄λ© νλ¦μ λ§λ€ νμλ μλ€. μΉ2μμλ νμκ°μ μ κ° λ¨κ³κ° μ΄ν μ§μ (μ΄λ©μΌ μ λ ₯, μΈμ¦, νλ‘ν μ€μ , μ½κ΄ λμ)μ΄λ€. μλΌλμμλ μ¬μ©μκ° μ±μ λ°©λ¬ΈνκΈ° μ λΆν° μ΄λ―Έ μ 체μ±μ κ°μ§κ³ μλ€. λΉμ μ΄ ν μΌμ κ·Έκ²μ κ°μ§νλ κ²λΏμ΄λ€.
βλ‘κ·ΈμΈβμ λ¨μν λ©μμ§μ μλͺ νλ κ²μ΄λ€. μ±μ΄ λ©μμ§λ₯Ό 보λ΄λ©΄, μ§κ°μ΄ μλͺ νκ³ , λ°±μλμμ κ·Έ μλͺ μ κ²μ¦νλ€. μΈμ μΏ ν€λ, JWTλ μλ€. μλͺ μ΄ λ°λ‘ μ¦λͺ μ΄λ€.
β οΈ μκ² λλ κ²
μ΄ λ°©μμ΄ λ¬΄μ‘°κ±΄ λ μ’μ κ²μ μλλ€. νΈλ μ΄λβμ€νκ° μ‘΄μ¬νλ€:
- λΉλ°λ²νΈ μ¬μ€μ μ΄ μλ€. μ¬μ©μκ° κ°μΈν€λ₯Ό μμ΄λ²λ¦¬λ©΄ μ κ·Ό κΆνμ μμ μλλ€. κ³μ μ 볡ꡬν κ΄λ¦¬μ λκ΅¬κ° μλ€.
- κ³μ λ³΅κ΅¬κ° μλ€. μΉ2μμλ μ΄λ©μΌλ‘ μ¬μ€μ λ§ν¬λ₯Ό λ³΄λΌ μ μλ€. μλΌλμμλ ν€νμ΄κ° μ μΌν μ 체μ±μ΄λ€. ν€νμ΄λ₯Ό μμΌλ©΄ ν΄λΉ μ£Όμμ μ°κ²°λ λͺ¨λ ν ν°, NFT, νλ‘κ·Έλ¨ μνκ° μ κ·Ό λΆκ°λ₯ν΄μ§λ€.
- μ μ§μ μΈ μ¨λ³΄λ©μ΄ λΆκ°λ₯νλ€. μΉ2μμλ λ‘κ·ΈμΈ μꡬ μ μ μ¬μ©μλ₯Ό μμ λ‘κ² νμνκ² ν μ μλ€. μλΌλμμλ 첫 μνΈμμ©λΆν° μ¬μ©μμ μ£Όμκ° μ 체μ±μ΄ λλ€. βμ΅λͺ μΈμ βμ΄ μ‘΄μ¬νμ§ μμΌλ©°, λμ€μ λ±λ‘λ κ³μ μΌλ‘ μ νλμ§ μλλ€.
ν€νμ΄ μμ± λ° μ μ₯μ λν κΈ°μ μ μΈλΆ μ¬ν(μ extractable: trueκ° μ€μνμ§, PKCS8μ΄ μ΄λ»κ² λμνλμ§ λ±)μ λ€λ₯Έ κΈμμ λ€λ£¨μμ§λ§, μ€μ λ‘ λ΄κ° λ¨Έλ¦Ώμμμ λ€μ μ§μΌ νλ κ²μ κ°λ°μ μν¬νλ‘μ°μ μ νμ΄μλ€.
π» μ½λ μ°¨μ΄
μΉ2 μΈμ¦
// Signup
app.post("/signup", async (req, res) => {
const hash = await bcrypt.hash(req.body.password, 10);
await db.users.create({ email: req.body.email, passwordHash: hash });
req.session.userId = user.id;
});
// Login
app.post("/login", async (req, res) => {
const user = await db.users.findByEmail(req.body.email);
if (!user || !(await bcrypt.compare(req.body.password, user.passwordHash))) {
return res.status(401).send("Invalid credentials");
}
req.session.userId = user.id;
});
μλΌλ μΈμ¦
// Connect wallet (browser side)
const { accounts } = await wallet.features["standard:connect"].connect();
const userAddress = accounts[0].address;
// That's it. The user is now "authenticated."
λΉλ°λ²νΈ ν΄μ±λ, μΈμ κ΄λ¦¬λ, λ°μ΄ν°λ² μ΄μ€ μ‘°νλ μλ€. μ§κ°μ΄ μνΈνμ μ¦λͺ μ λ΄λΉνκ³ , μ±μ 곡κ°ν€λ₯Ό μ½κΈ°λ§ νλ©΄ λλ€.
π― μ μ€μνκ°
Connect Wallet ν¨ν΄μ λ¨μν UI νΈλ λκ° μλλ€. μ μ²΄μ± μμ²΄κ° κ·Όλ³Έμ μΌλ‘ λ°λλ κ²μ μλ―Ένλ€.
- μΉ2μμλ μΈμ¦ λ‘μ§μ μ± μμ λ§λ λ€.
- μλΌλμμλ μΈμ¦μ΄ μΈνλΌλ€ β μ§κ°μ μ‘΄μ¬νκ³ , μ½λλ² μ΄μ€μλ μ‘΄μ¬νμ§ μλλ€.
μ¦, λΉλ°λ²νΈ μ μ₯, μΈμ νμ·¨, μ΄λ©μΌ μΈμ¦ λ±μ μ κ²½ μΈ νμκ° μμ΄μ§λ λ°λ©΄, λ¬Έμ κ° λ°μνμ λ μ§μ ν°μΌμ΄λ κ³μ 볡ꡬμ μμ‘΄ν μλ μκ² λλ€.
μ΄ νΈλ μ΄λβμ€νβμ½λλ μ€μ΄λ€μ§λ§ μ± μμ λμ΄λλ€βλ₯Ό μ΄ν΄νκ³ λλ, Connect Wallet λ²νΌμ λ¨μν κ°μνλ κ²μ΄ μλλΌ μ 체μ±μ λν μμ ν λ€λ₯Έ μ κ·Ό λ°©μμΌλ‘ 보μ΄κΈ° μμνλ€.
λ€μ κΈ: Transactions arenβt HTTP requests. Theyβre signed checks β and failed ones still cost you.
μ΄ κΈμ 5μ 15μΌ~22μΌ μ§νλλ 100 Days of Solana Writing Challenge μ μΆλ¬Όμ΄λ€.