본문 바로가기
개발정리 (nodeJS)

[nodeJS] JWT를 이용한 로그인 시스템 구현하기

by 할리갈리0 2024. 1. 6.

JWT(JSON Web Token)는 클라이언트와 서버간에 정보를 안전하게 전달하기 위한 방법입니다. JWT는 상태를 유지하지 않는 Stateless한 특성을 가지고 있어, 확장성 있는 시스템을 구축하는 데 매우 유용합니다. 하지만, JWT는 만료 시간이 있어 주기적으로 갱신해야 합니다.

 

1. 필요한 모듈 설치하기

npm install express jsonwebtoken body-parser

 

2. JWT 생성하기

로그인 요청이 들어오면, 서버는 클라이언트에게 JWT를 발급하기 위해 'jsonwebtoken' 모듈의 'sign' 메소드를 사용하여 JWT를 생성

app.post('/login', (req, res) => {
    const user = { 
        id: 1, 
        username: 'test',
    }; 
    const token = jwt.sign(user, 'your_secret_key', { expiresIn: '1h' });
    res.json({ token });
});

 

3. JWT 검증하기

서버는 클라이언트가 보낸 JWT의 유효성 검사하기 위해 'jsonwebtoken' 모듈의 'verify' 메소드를 사용

app.get('/protected', (req, res) => {
	// request 헤더에서 authorization bearer 토큰 받기
    const token = req.headers["authorization"]?.split(" ")[1];

    if (!token) {
        return res.status(401).json({ error: 'No token provided' });
    }
    
    // 정상적인 토큰인지 확인
    jwt.verify(token, 'your_secret_key', (err, user) => {
        if (err) {
            return res.status(401).json({ error: 'Token is not valid' });
        }

        req.user = user;
        res.json({user: user, message: 'Protected data' });
    });
});

 

4. 리프레시 토큰 생성하기

리프레시 토큰 : 액세스 토큰이 만료되었을 때 사용자의 세션을 유지하기 위한 토큰

액세스 토큰이 만료되면, 클라이언트는 리프레시 토큰을 사용하여 토큰을 요청하면 서버는 새로운 액세스 토큰을 생성하여 반환

app.post('/token', (req, res) => {
    const refreshToken = req.body.token;
    console.log(refreshToken)
    
    if (!refreshToken) {
        return res.status(401).json({ error: 'No token provided' });
    }
    
    // 기존 토큰의 유효성 검사
    jwt.verify(refreshToken, 'your_secret_key', (err, user) => {
        console.log(user)
        if (err) {
            return res.status(403).json({ error: 'Token is not valid' });
        }
        // 새로운 페이로드 생성
        const payload = {
            id: 2, 
            username: user.username,
        };
        const newToken = jwt.sign(payload, 'your_secret_key', { expiresIn: '1h' });
        res.json({ newToken });
    });
});

 

5. 토큰 삭제하기

로그아웃 요청이 들어오면, 서버는 클라이언트의 JWT를 무효화

app.get('/logout', (req, res) => {
    const token = req.headers["authorization"]?.split(" ")[1];
    console.log(token)
    if (!token) {
        return res.status(401).json({ error: 'No token provided' });
    }

	// 토큰 무효화
    const decoded = jwt.decode(token);
    if (!decoded) {
        return res.status(403).json({ error: 'Token is not valid' });
    }

    res.json({ message: 'good Bye!' });
});

 

사용자 인증과 세션 관리를 효과적으로 수행할 수 있는 JWT는 HTTP 헤더에 포함되어 서버와 클라이언트 사이에 안전하게 전달될 수 있습니다. 

 

반응형