아이디 찾기 , crypto를 이용한 비밀번호 재설정 로직

tpids·2024년 10월 24일

project2

목록 보기
12/17

아이디 찾기 , 비밀번호 재설정 로직

crypto를 이용한 비밀번호 재설정.

const tempPassword = crypto.randomBytes(6).toString('hex');
  • crypto.randomBytes(6): crypto 모듈을 이용해 길이가 6인 랜덤한 바이트를 생성. 이는 보안적인 목적으로 사용되며, 예측 불가능한 임시 비밀번호를 만들기 위함.
  • .toString('hex'): 생성된 랜덤 바이트를 16진수(hex) 문자열로 변환
  • 결과: 길이가 12자인 16진수 문자열(예: '3f4b9c2d12a3')이 임시 비밀번호로 생성.

비밀번호 해시화

const hashedPassword = await bcrypt.hash(tempPassword, 10);
  • bcrypt.hash(tempPassword, 10): 임시 비밀번호를 bcrypt 알고리즘을 사용하여 해시화.
  • tempPassword: 앞서 생성한 임시 비밀번호.
  • 10: 해시를 생성할 때 사용할 솔트(salt) 값. 숫자가 클수록 더 강력한 해시가 생성되지만, 연산 비용이 증가.
  • 결과: 임시 비밀번호를 해시화한 문자열이 hashedPassword 변수에 저장.

authFindRoutes.js

const express = require('express');
const router = express.Router();
const db = require('../models/db');
const crypto = require('crypto');
const bcrypt = require('bcryptjs');

/**
 * @swagger
 * /find/id:
 *   post:
 *     summary: 아이디 찾기
 *     tags: [Users]
 *     requestBody:
 *       required: true
 *       content:
 *         application/json:
 *           schema:
 *             type: object
 *             properties:
 *               mem_name:
 *                 type: string
 *               phone_number:
 *                 type: string
 *     responses:
 *       200:
 *         description: 성공적으로 아이디를 찾았습니다.
 *         content:
 *           application/json:
 *             schema:
 *               type: object
 *               properties:
 *                 username:
 *                   type: string
 *       400:
 *         description: 잘못된 요청
 *       404:
 *         description: 일치하는 사용자를 찾을 수 없습니다.
 *       500:
 *         description: 데이터베이스 오류
 */

// 아이디 찾기 API
router.post('/id', async (req, res) => {
    const { mem_name, phone_number } = req.body;

    if (!mem_name || !phone_number) {
        return res.status(400).json({ message: '이름과 휴대폰 번호를 입력해주세요.' });
    }

    // 이름과 휴대폰 번호로 사용자 조회
    const query = 'SELECT username FROM Users WHERE mem_name = ? AND phone_number = ?';
    try {
        const results = await db.executeQuery(query, [mem_name, phone_number]);
        if (results.length > 0) {
            return res.status(200).json({ username: results[0].username });
        } else {
            return res.status(404).json({ message: '일치하는 사용자를 찾을 수 없습니다.' });
        }
    } catch (err) {
        return res.status(500).json({ message: '데이터베이스 오류' });
    }
});

/**
 * @swagger
 * /find/password:
 *   post:
 *     summary: Request temporary password
 *     tags: [Users]
 *     description: Generate and return a temporary password if username and phone number match.
 *     requestBody:
 *       required: true
 *       content:
 *         application/json:
 *           schema:
 *             type: object
 *             required:
 *               - username
 *               - phone_number
 *             properties:
 *               username:
 *                 type: string
 *               phone_number:
 *                 type: string
 *     responses:
 *       200:
 *         description: Temporary password is generated and returned.
 *         content:
 *           application/json:
 *             schema:
 *               type: object
 *               properties:
 *                 message:
 *                   type: string
 *                 tempPassword:
 *                   type: string
 *       404:
 *         description: User not found
 *       500:
 *         description: Database error
 */

// 비밀번호 재설정 API
router.post('/password', async (req, res) => {
    const { username, phone_number } = req.body;

    if (!username || !phone_number) {
        return res.status(400).json({ message: '아이디와 휴대폰 번호를 입력해주세요.' });
    }

    const query = 'SELECT * FROM Users WHERE username = ? AND phone_number = ?';
    try {
        const results = await db.executeQuery(query, [username, phone_number]);

        if (results.length > 0) {
            const user = results[0];
            
            // 임시 비밀번호 생성
            const tempPassword = crypto.randomBytes(6).toString('hex');  // 임시 비밀번호 (길이 6)
            
            // 비밀번호 해시화 (bcrypt로 처리)
            const hashedPassword = await bcrypt.hash(tempPassword, 10);  // 솔트 값 10
            
            // 임시 비밀번호를 DB에 저장
            const updateQuery = 'UPDATE Users SET password = ? WHERE username = ?';
            await db.executeQuery(updateQuery, [hashedPassword, username]);

            return res.status(200).json({ message: '임시 비밀번호가 발급되었습니다.', tempPassword: tempPassword });
        } else {
            return res.status(404).json({ message: '일치하는 사용자를 찾을 수 없습니다.' });
        }
    } catch (err) {
        return res.status(500).json({ message: '데이터베이스 오류' });
    }
});


module.exports = router;

아이디 찾기 테스트

비밀번호 재설정 테스트

8afd59d50234 이라는 임시비밀번호 생성 완료


로그인 시도시 성공하여 JWT토큰을 발급한 모습

DB 비밀번호 해시화도 성공적으로 되어있음

profile
개발자

0개의 댓글