https://www.daleseo.com/js-jwt/

https://velog.io/@hoonnn/NodeJS-JWT를-이용한-로그인-구현하기

https://velog.io/@jguuun/NodeJWT

secret key는 프로젝트 자체에 가지고 있는 어플리케이션만의 key

각 유저를 위해 생성하는 토큰은 해당 유저의 정보를 주고 받을 때 보안을 위해 알맞은 곳에만 정보를 제공하기 위한 검증 수단

자바스크립트에서는 jsonwebtoken 패키지를 이용하여 토큰을 발급하고 검증할 수 있다.

jwt.sign() → default로 HS256 알고리즘을 사용하여 토큰화하고, 첫번째 인자에 토큰에 포함할 JSON 데이터의 내용(= payload)과 두번째 인자에 secret key(= key)를 넣는다. 원한다면 마지막 인자에 expiresIn에 값을 넣어 토큰의 유효기간을 지정할 수 있다.

jwt.verify() → sign()과 같은 인자를 이용하여 토큰이 유효한지 검증한 후 검증되면 sign()에 넘겼던 JSON 데이터와 함께 iat(issue at) 값을 리턴한다. 유효한 토큰이 아니거나 만료된 것이라면 에러가 발생한다.

jwt.decode() → 토큰에 들어있는 JSON 데이터만 필요한 경우 사용할 수 있는 함수이다. verify()와 다르게 토큰 검증 과정을 빼고 토큰만 인자로 전달한다. 만약 JSON 데이터(= payload) 뿐만 아니라 header(알고리즘에 대한 내용)과 signature 정보까지 원한다면 complete 인자에 true를 기입하면 된다.

ex)

exports.signupTeacher = (req, res) => {
    const { username, password, account, bank } = req.body;
    const image = req.file ? req.file.buffer : null;
    
    const sql = 'INSERT INTO teachers (username, password, account, bank, image) VALUES (?, ?, ?, ?, ?)';
    db.query(sql, [username, password, account, bank, image], (err, result) => {
        if (err) return res.status(500).send(err);

        const token = jwt.sign({ userId: result.insertId, username }, process.env.JWT_SECRET, { expiresIn: '3h' });
        res.status(201).json({ userId: result.insertId, role: 'teacher', username, password, account, bank, token });
    });
};

위 코드를 통해 선생 유저를 생성하면 아래와 같이 userID와 role에 대한 정보와 함께 token이 생성된걸 알 수 있다. 토큰에는 유저를 식별할 수 있는 userId와 username에 대한 정보가 포함되게 하였다. 해당 토큰은 HS256 알고리즘을 사용한다

image.png