Menu
CoddyTech

회원가입 규칙

Coddy Node.js 여정의 인증과 보안 섹션에 포함된 레슨. 17개 중 3번째.

현재는 누구나 같은 이름으로 두 번 가입하거나, 비밀번호를 1로 설정할 수 있습니다. 가입 처리에서는 데이터를 저장하기 전에 전달받은 내용을 확인해야 합니다.

문제가 무엇인지 나타내는 상태 코드가 두 가지 있습니다. 400 잘못된 요청은 요청 자체가 허용되지 않음을 의미합니다. 예를 들어 비밀번호가 너무 짧은 경우입니다. 409 충돌은 이미 보유한 데이터와 충돌함을 의미합니다. 예를 들어 이미 사용 중인 이름이 이에 해당합니다.

이름 표기도 통일해야 합니다. Ada와 ada는 읽는 사람 누구에게나 같은 사람처럼 보입니다. 따라서 이름을 저장하기 전과 조회하기 전에 소문자로 바꾸세요.

const email = String(req.body.email ?? '').trim().toLowerCase();
if (await subscribers.findOne({ email })) {
    return res.status(409).json({ error: 'Already subscribed' });
}
challenge icon

챌린지

쉬움
  • POST /signup는 사용자 이름이 없거나 비밀번호가 8자 미만이면 400 { error }로 응답합니다.
  • 이미 사용 중인 사용자 이름에는 409 { error }로 응답합니다.
  • 사용자 이름은 소문자로 저장되며, POST /login은 대소문자를 구분하지 않습니다.

Ada로 가입한 다음 ada로 가입하고, ADA로 로그인하세요. 비밀번호 1234도 시도해 보세요.

직접 해보기

import express from 'express';
import { users } from './db.js';
import { hashPassword, verifyPassword } from './passwords.js';

const app = express();
app.use(express.json());

app.post('/signup', async (req, res) => {
    const { username, password } = req.body;
    await users.insertOne({ username, passwordHash: await hashPassword(password) });
    res.status(201).json({ username });
});

app.post('/login', async (req, res) => {
    const { username, password } = req.body;
    const user = await users.findOne({ username });
    if (!user || !(await verifyPassword(password, user.passwordHash))) {
        return res.status(401).json({ error: 'Wrong username or password' });
    }
    res.json({ username: user.username });
});

// signup이 저장한 내용을 보여줍니다. 학습용으로만 사용하세요. 실제 앱에는 이런 경로가 없습니다.
app.get('/debug/users/:username', async (req, res) => {
    const user = await users.findOne({ username: req.params.username });
    res.json(user ? { username: user.username, passwordHash: user.passwordHash } : null);
});

app.listen(3000, () => {
    console.log('Vault is running on port 3000');
});
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

인증과 보안의 모든 레슨