티스토리 뷰

회원가입과 로그인 페이지는 동작할 정도로만 간단하게만 구현했다.
사용자의 아이디, 패스워드, 이름만 받고 다른 정보들은 따로 받지 않는다.
또한 중복 체크라던가 글자수 제한 등의 조건들을 적용하지는 않았다.

 

* 회원가입 URI : /users/login

 

1. controllers/userController.js

const express = require("express")
const router = express.Router()

const userService = require("../services/userService")

// 로그인
router.post("/login", async (req, res) => {
    const uid = req.body.uid
    const upw = req.body.upw

    const login = await userService.login(uid, upw)

    return res.json({ login })
})
  • user의 정보인만큼 URL에 바로 노출되는 GET보다 body에 담아 POST로 보내는 방식이 적합해보였다.

 

2. services/userService.js

const db = require("../libs/db")
const jwt = require('jsonwebtoken');
const jwtSecret = "abcdsfas1234sdefg1234567"

const userService = {
    login: async (uid, upw) => {
        const conn = await db.getConnection();
    
    	// * users 테이블 조회
        const [user] = await conn.query("SELECT * FROM users WHERE uid = ? AND upw = ?", [uid, upw]);

        conn.release();
        
        // * 예외 처리
        if(user.length === 0) {
            return {result: "FAILED"};
        }
        
        // * JWT 사용
        const jwtToken = jwt.sign({ id: user[0].id }, jwtSecret)

        return { result: "SUCCESS", jwtToken};
    },
}

module.exports = userService;
  • 데이터를 직접적으로 다루는 부분이라 db 커넥션 모듈화했던 것을 사용한다.
  • 토큰 기반 인증으로 JWT 를 사용할 예정이라 jsonwebtoken 라이브러리도 설치했다.
    → JWT는 쿠키에 비해 안전성이 높고 세션처럼 저장공간을 차지한다거나, 세션 DB에 접근해서 비교하는 작업을 하지 않기 때문에 비교적 효율적이라 생각했다.

 

* users 테이블 조회

const [user] = await conn.query("SELECT * FROM users WHERE uid = ? AND upw = ?", [uid, upw]);
  • where 조건절에 의해 users 테이블에서 유저가 입력한 uid와 upw가 모두 일치하는 행만 반환

 

* 예외 처리

if(user.length === 0) {
    return {result: "FAILED"};
}
  • uid와 upw가 모두 일치하는 행이 없을 경우 = 유저 입력값이 잘못됨 (① 해당 아이디 존재 x  ② 비밀번호 일치 x)
    → 바로 "FAILED" 반환

 

* JWT 사용

const jwtToken = jwt.sign({ id: user[0].id }, jwtSecret)
  • secret 키는 내가 임의로 지정했다.
  • 보안성 측면에서 user의 id(인덱스값)만 담았다.
    → jwt도 암호화는 아니기 때문에 디코딩 방식만 알면 누구나 정보를 확인할 수 있다.
  • 결과 반환할 때 생성된 jwtToken 값을 함께 return한다.

 


 

개선할 점

  • jwtToken 만료에 대한 처리
  • 에러 핸들링
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함