>웹 프론트엔드 >JS 튜토리얼 >Express, JWT, Bcrypt 및 MySQL을 사용한 사용자 인증 API

Express, JWT, Bcrypt 및 MySQL을 사용한 사용자 인증 API

DDD
DDD원래의
2024-11-05 13:32:02999검색

User Authentication API with Express, JWT, Bcrypt, and MySQL

이 애플리케이션은 세션 관리를 위해 JWT(JSON 웹 토큰)를 사용하고 비밀번호를 안전하게 저장하기 위해 bcrypt를 사용하여 Express로 구축된 간단한 인증 서버입니다. 사용자는 등록하고 로그인하여 보호된 경로에 액세스할 수 있습니다. MySQL은 사용자 데이터를 저장하는 데 사용됩니다.

사용된 기술

1. Express.js: 경로 및 미들웨어를 처리하기 위한 웹 프레임워크
2. bcrypt.js: 비밀번호를 안전하게 해싱하기 위한 라이브러리.
3. jsonwebtoken: JWT 토큰 생성 및 검증을 위한 라이브러리
4. mysql2: Promises를 지원하는 Node.js용 MySQL 클라이언트
5. cookie-parser: 쿠키를 구문 분석하는 미들웨어.

코드 분석

1. 필수 라이브러리 가져오기

const express = require('express');
const jwt = require('jsonwebtoken');
const bcrypt = require('bcryptjs');
const cookieParser = require('cookie-parser');
const mysql = require('mysql2/promise');
  • express: 경로를 생성하고 HTTP 요청을 처리하는 기능을 제공합니다.
  • jsonwebtoken: 사용자 세션에 대한 JWT를 생성하고 확인하는 데 사용됩니다.
  • bcryptjs: 비밀번호를 데이터베이스에 저장하기 전에 해싱하는 데 사용됩니다.
  • cookie-parser: 들어오는 HTTP 요청에서 쿠키를 구문 분석하는 미들웨어.
  • mysql2/promise: Promise를 지원하는 MySQL 클라이언트로 비동기 작업이 가능합니다.

2. Express 앱 초기화 및 상수 정의

const app = express();
const PORT = 3000;
const JWT_SECRET = 'your_jwt_secret_key';
  • app: Express 애플리케이션 인스턴스
  • PORT: 서버가 수신 대기하는 포트입니다.
  • JWT_SECRET: JWT 서명에 사용되는 비밀 키입니다. 이를 프로덕션 환경에서 무작위로 생성된 안전한 값으로 바꾸세요.

3. 데이터베이스 연결 설정

const db = await mysql.createConnection({
    host: 'localhost',
    user: 'your_mysql_user',
    password: 'your_mysql_password',
    database: 'user_auth'
});

  • db: MySQL 데이터베이스 연결 개체
  • mysql.createConnection(): 비차단 쿼리에 필요한 async/await를 사용하여 MySQL 데이터베이스에 대한 연결을 설정합니다.
  • host: Yout MySql 애플리케이션 호스트 이름, localhost에서 실행하는 경우 localhost만 입력하고, MySql을 서버에 배포한 경우 PORT와 함께 서버 호스트 이름을 사용하세요.
  • 사용자: MySql 사용자 이름
  • password: MySql 비밀번호
  • 데이터베이스: 데이터베이스 이름

4. 미들웨어 설정

app.use(express.json());
app.use(cookieParser());
  • express.json(): JSON 요청 본문을 구문 분석하는 미들웨어.
  • cookieParser(): 쿠키를 구문 분석하는 미들웨어로 req.cookies에서 쿠키를 읽을 수 있습니다.

5. 경로 등록

/등록
이 경로는 비밀번호를 해시하고 데이터베이스에 저장하여 새로운 사용자를 등록합니다.

const express = require('express');
const jwt = require('jsonwebtoken');
const bcrypt = require('bcryptjs');
const cookieParser = require('cookie-parser');
const mysql = require('mysql2/promise');
  • db.execute(): 해당 이메일을 가진 사용자가 이미 존재하는지 확인하는 쿼리를 실행합니다. 그렇다면 400 상태를 반환합니다.
  • bcrypt.hash(password, 10): 보안을 위해 솔트 반올림 값 10으로 비밀번호를 해시합니다.
  • db.execute() (삽입): 사용자 이름, 이메일, 해시된 비밀번호를 데이터베이스에 저장합니다.

6. 로그인 경로

/로그인
이 경로는 자격 증명을 확인하고 JWT 토큰을 생성하여 기존 사용자에 로그인합니다.

const app = express();
const PORT = 3000;
const JWT_SECRET = 'your_jwt_secret_key';
  • bcrypt.compare(password, user.password): 해시된 비밀번호가 데이터베이스에 저장된 비밀번호와 일치하는지 확인합니다.
  • jwt.sign(): 사용자 정보(예: ID, 이름, 이메일)가 포함된 JWT를 생성합니다. 토큰은 1시간 후에 만료됩니다. jwt.sign() 메소드는 두 개의 인수 payload, JWT_SECRET, options(선택 사항)
  • 을 사용합니다.
  • res.cookie(): httpOnly(서버에서만 액세스 가능) 및 sameSite 설정으로 보호되는 JWT로 쿠키를 설정합니다.

7. JWT 검증 미들웨어

verifyToken 미들웨어는 유효한 JWT 토큰이 있는 요청만 보호된 경로에 액세스할 수 있도록 보장합니다.

const db = await mysql.createConnection({
    host: 'localhost',
    user: 'your_mysql_user',
    password: 'your_mysql_password',
    database: 'user_auth'
});

  • req.cookies.token: 쿠키에서 토큰을 추출합니다.
  • jwt.verify(token, JWT_SECRET): JWT 비밀 키를 사용하여 토큰을 확인합니다. 유효한 경우 decoded **에는 **req.user에 할당된 토큰의 페이로드가 포함됩니다.
  • next(): 토큰이 유효하면 다음 미들웨어로 진행합니다.

8. 보호된 경로 - /보호됨

인증된 사용자만 액세스할 수 있는 샘플 보호 경로입니다. 토큰의 사용자 이름을 사용하여 맞춤 인사말을 반환합니다.

app.use(express.json());
app.use(cookieParser());
  • verifyToken: 사용자의 인증 상태를 확인하기 위해 적용되는 미들웨어입니다.
  • req.user.name: 디코딩된 JWT 페이로드에서 사용자 이름에 액세스합니다.

9. 서버 시작

서버는 정의된 PORT를 수신합니다.

app.post('/register', async (req, res) => {
    const { name, email, password } = req.body;

    try {
        // Check if user already exists
        const [rows] = await db.execute('SELECT * FROM users WHERE email = ?', [email]);
        if (rows.length > 0) {
            return res.status(400).json({ message: 'User already exists' });
        }

        // Hash the password
        const hashedPassword = await bcrypt.hash(password, 10);

        // Save the user in the database
        await db.execute('INSERT INTO users (name, email, password) VALUES (?, ?, ?)', [name, email, hashedPassword]);
        res.status(201).json({ message: 'User registered successfully!' });
    } catch (error) {
        console.error(error);
        res.status(500).json({ message: 'Server error' });
    }
});

전체 코드

app.post('/login', async (req, res) => {
    const { email, password } = req.body;

    try {
        // Find user
        const [rows] = await db.execute('SELECT * FROM users WHERE email = ?', [email]);
        const user = rows[0];
        if (!user) {
            return res.status(400).json({ message: 'User not found' });
        }

        // Check password
        const isMatch = await bcrypt.compare(password, user.password);
        if (!isMatch) {
            return res.status(400).json({ message: 'Invalid credentials' });
        }

        // Create JWT token
        const token = jwt.sign({ id: user.id, name: user.name, email: user.email }, JWT_SECRET, { expiresIn: '1h' });

        // Set JWT in cookie
        res.cookie('token', token, {
            httpOnly: true,
            secure: process.env.NODE_ENV === 'production',
            sameSite: 'Strict',
            maxAge: 3600000 // 1 hour
        });

        res.json({ message: 'Logged in successfully!' });
    } catch (error) {
        console.error(error);
        res.status(500).json({ message: 'Server error' });
    }
});

요약

이 애플리케이션:

  1. 비밀번호를 해싱하고 사용자 데이터를 MySQL에 저장하여 사용자 등록을 허용합니다.
  2. JWT 인증으로 보안 로그인을 지원합니다.
  3. 클라이언트 측에 JWT를 저장하기 위해 쿠키를 사용합니다.
  4. 보호된 경로에 대한 액세스 권한을 부여하기 전에 JWT를 확인하기 위한 미들웨어를 제공합니다.

위 내용은 Express, JWT, Bcrypt 및 MySQL을 사용한 사용자 인증 API의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.