카테고리 없음
9주차 (3)
jaeoun0238
2024. 12. 26. 21:04
npx prisma migrate dev --name <마이그레이션 이름>
이게 무슨말인지 잘몰랐는데
사실 db push === npx prisma migrate dev --name <마이그레이션 이름>
였던것이었습니다!
뭔가 왜 뒤에다가 이름을 넣지 라고 생각했는데
이런식으로 파일이름이 저장되면서 기록되는 방식이라는걸 깨달았습니다.
라우터들에 middleware추가
import express from 'express';
import { prisma } from '../uts/prisma/index.js';
import errModel from '../middlewares/error.middleware.js';
import authMiddleware from '../middlewares/auth.middleware.js';
import bcrypt from 'bcrypt';
import dotenv from 'dotenv';
import jwt from 'jsonwebtoken';
dotenv.config();
const router = express.Router();
/** 사용자 회원가입 API **/
// localhost:c/api/sign-up POST
router.post('/sign-up', async (req, res) => {
console.log('회원가입 요청:', req.body);
const { email, password, userName, nickname } = req.body;
console.log({
email,
password,
userName,
nickname,
});
// - [ ] **이메일 가입 및 인증 기능**
// - 이메일 가입 시 이메일 인증 기능을 포함하는 것이 좋습니다.
// - [Nodemailer](https://github.com/nodemailer/nodemailer)와 같은 패키지 사용을 하여 완료해보세요!
// 이메일 중복 체크
const isExistEmail = await prisma.users.findUnique({
where: { email },
});
if (isExistEmail) {
return res.status(409).json({ message: '이미 존재하는 이메일입니다.' });
}
// 이메일 형식 체크
if (!/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(email)) {
return res
.status(409)
.json({ message: '이메일 형식이 적절하지 않습니다.' });
}
// 비밀번호 형식 체크
if (!/^.{1,6}$/.test(password)) {
return res
.status(409)
.json({ message: 'password는 6자리 이하로만 설정할 수 있습니다' });
}
// 닉네임 중복 확인
const isExistUserByNickname = await prisma.users.findUnique({
where: { nickname },
});
if (isExistUserByNickname)
return res.status(409).json({ errorMessage: '이미 존재하는 닉네임입니다' });
const hashedPassword = await bcrypt.hash(password, 10);
// 사용자 정보를 account 테이블에 추가
const userData = await prisma.users.create({
data: {
email,
password: hashedPassword,
userName,
nickname,
},
});
return res.status(201).json({
message: '회원가입이 완료되었습니다.',
userId: userData.userId,
});
});
router.post('/sign-in', async (req, res) => {
// 클라이언트에서 로그인 요청 시 받은 email, password
const { email, password } = req.body;
const accountData = await prisma.users.findUnique({ where: { email } });
if (!accountData)
return res.status(401).json({ message: '존재하지 않는 email입니다.' });
// 입력받은 사용자의 비밀번호와 데이터베이스에 저장된 비밀번호를 비교합니다.
else if (!(await bcrypt.compare(password, accountData.password)))
return res.status(401).json({ message: '비밀번호가 일치하지 않습니다.' });
console.log('Secret Key:', process.env.SERVER_ACCESS_KEY);
// 비밀번호를 암호화(bcrypt 사용)하여 저장.
// 로그인에 성공하면, 사용자의 accountId를 바탕으로 토큰을 생성합니다.
const token = jwt.sign(
{
userId: accountData.userId,
},
// JWT를 서명하는 데 사용되는 비밀 키
// 서버가 비밀 키를 사용하여 토큰 변조 여부를 알 수 있다
process.env.JWT_SECRET,
// 엑세스 토큰
{ expiresIn: '5m' },
);
res.cookie('userId', `Bearer ${token}`);
return res
.status(200)
.json({ message: '로그인 성공', email: accountData.email });
// res.cookie('userId', accountData.userId, {
// httpOnly: true, // XSS 공격 방지
// secure: process.env.NODE_ENV === 'production', // HTTPS에서만 전송 (배포 환경에서만 적용)
// maxAge: 10 * 60 * 1000, // 쿠키 만료 시간 설정 (10분)
// });
// 로그인시 jwt로 인증하고 쿠키에 저장하기
// 쿠키를 받아올수있도록 로직 추가해야함
// 1. 로그인 했을때 jwt 생성과 동시에 쿠키를 저장
// 2. 클라이언트는 jwt를 서버로 전송
// 3. 서버는 jwt를 확인하여 사용자 검증
});
// 로그아웃
router.post('/sign-out', (req, res) => {
try {
// authorization 쿠키를 삭제하여 로그아웃 처리
res.clearCookie('userId');
return res.status(200).json({ message: '로그아웃 성공' });
} catch (error) {
next(error); // 에러 핸들링 미들웨어로 전달
}
});
export default router;
jwt와 쿠키를 같이 이용하는 방식으로 로그인 로그아웃 구현완료
로그인을 하면 쿠키를 받고
로그아웃하면 쿠키가 지워진다