Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
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
Tags
more
Archives
Today
Total
관리 메뉴

개발공부일지

NodeJS - Database - JWT 사용해서 LOGIN 구현하기 ② 본문

NodeJS

NodeJS - Database - JWT 사용해서 LOGIN 구현하기 ②

보람- 2023. 9. 25. 18:04
// src/index.js

router.get("/", (req, res) => {
    // console.log(req.headers.cookie);
    res.render("index.html", { user: req.user });
});​

목차

1. 로그인 했을때 쿠키를 만들고 화면 다르게 보여주기

2. token 정보 증명하기

3. DB에 user_id 요청해서 로그인 구현 완성하기


 

 

 

 

1. 로그인 했을때 쿠키를 만들고 화면 다르게 보여주기

 

- user_id, user_pw를 쿠키안에 jwt토큰을 넣어주기

// src/user/user.servcie.js

const userRepository = require("./user.repository");
const JWT = require("../../lib/jwt");
const jwt = new JWT();

exports.postLogin = async (userid, userpw) => {
    // return `login service`;

    try {
        const result = await userRepository.findOneByUserInfo(userid, userpw);
        if (!result) return { isLogin: false, data: null };
        const token = jwt.sign({ id: result.userid });
        return { isLogin: true, data: token };
    } catch (e) {
        throw new Error("Service Error" + e.message);
    }
};
npm install cookie-parser
// server.js

const cookieParser = require("cookie-parser");

app.use(cookieParser());
// src/user/user.controller.js

exports.postLogin = async (req, res, next) => {
    try {
        const { user_id, user_pw } = req.body;
        const result = await userService.postLogin(user_id, user_pw);
        // console.log(result);
        if (!result.isLogin) return res.redirect("/");

        res.cookie("token", result.data);

        res.redirect("/");
    } catch (err) {
        next();
    }
};

 

- cookie parser를 사용해서 req.cookies로 쿠키내용을 확인할수있다.

   - res.cookie() 로 name, value, option을 적을수있다.

     - 옵션으로 maxAge, domain, path를 적는다!

        - domain에 localhost라고 적었다면, url에서도 localhost 로 들어가야한다.

 

 

 

<body>
        <h2>HOME</h2>
        {% if token %} 
        로그인 되었음!!!! <a href="/users/logout">로그아웃</a>
        {% else %} 
        로그인하세요 <a href="/users/login">로그인 하기</a>
        {% endif %}
    </body>
// src/user/user.controller.js

exports.getLogout = (req, res) => {
    res.setHeader("Set-Cookie", `token=; Max-Age=0; domain=127.0.0.1; path=/;`);
    // res.clearCookie("token");
    res.redirect("/");
};

 

- nunjucks 문법 사용해서 token여부를 확인하기

- 로그인이 되었다면 로그아웃을 보여주고

- 로그인을 하지 않았다면 로그인을 보여주기

- getLogout controller 만들어주기 

  - 유저가 로그아웃을 누른다면 쿠키도 사라지게하기

 

 

 

 

 

2. token 정보 증명하기

 

// src/auth/auth.middleware.js

const JWT = require("../../lib/jwt");
const jwt = new JWT();

exports.auth = async (req, res, next) => {
    try {
        const { token } = req.cookies;

        const payload = jwt.verify(token, "guniee");
        console.log("payload : ", payload);
        // payload :  { id: 'guniee' }
    } catch (e) {
        console.log(e.message);
    }
    next();
};
// server.js

const middleware = require("./src/auth/auth.middleware");

app.use(middleware.auth);
token : eyJ0eXBlIjoiSldUIiwiYWxnIjoiSFMyNTYifQ.eyJpZCI6Imd1bmllZSJ9.ZmcGAX9HA4898EevoIEjww3HztCbKypfF-MIWdqHCDU
// lib/jwt.js

verify(token, salt) {
        try {
            const [header, payload, signature] = token.split(".");
            const base64url = [header, payload].join(".");
            const newSignature = this.createSignauture(base64url, salt);
            if (signature !== newSignature) return null;

            const result = this.decode(payload);
            return result;
        } catch (e) {}
    }

- middleware를 사용해서 토큰이 존재하는지 찾기

   - token이 있다면 유효성 검사하기

- jwt에서 검사하는 verify() 메서드를 만들어서 payload값을 가져오기

   - payload에서 나온 user id 확인하기

 

 

 

 

3. DB에 user_id 요청해서 로그인 구현 완성하기

// src/user/user.repository.js

exports.findOne = async (field, value) => {
    try {
        const sql = `select * from Users where ${field}=?`;
        const [[result]] = await pool.query(sql, [value]);
        return result;
    } catch (e) {
        throw new Error("Repository Error" + e.message);
    }
};
// src/user/user.service.js

exports.findOneByUserId = async (userid) => {
    try {
        const result = await userRepository.findOne("userid", userid);
        return result;
    } catch (e) {
        throw new Error(e.message);
    }
};
// src/auth/auth.middleware.js

exports.auth = async (req, res, next) => {
    try {
        const { token } = req.cookies;
        if (!token) return next();

        const payload = jwt.verify(token, "guniee");
        console.log("payload : ", payload);
        // payload :  { id: 'guniee' }

        const user = await userService.findOneByUserId(payload.id);
        req.user = user;
        console.log("user :", user);
        // user : { userid: 'guniee', userpw: '1234' }
        next();
    } catch (e) {
        next(e);
    }
};
<body>
        <h2>HOME</h2>
        {% if user %} {{user.userid}} 님 환영합니다~!
        <a href="/users/logout">로그아웃</a>
        {% else %} 로그인하세요
        <a href="/users/login">로그인 하기</a>
        {% endif %}
    </body>

- repository 에서 user_id 를 가져오기

- service 에서 Users 테이블 field에서 유저 정보를 찾기

- middleware에서 유저 아이디를 담아주기

- 유저가 로그인을 했다면 @@@님 환영한다고 "/" index에서 보여주기

    - user : req.user 를 담아서 ( nunjucks 문법 수정하)

 

 

 

 


※ 예외처리!!!!!!!

 

※ 의존성 주입

※ 쿠키 만료시간