본문 바로가기
백엔드/NodeJs

[NodeJs] 로그인 사용자 정보를 JWT로 인증하기

by jinwanseo 2021. 8. 5.
728x90

[NodeJs] 사용자 정보를 JWT를 통해 인증하기 Json Web Token

 

 

⭐️ NodeJs로 서버를 열고 로그인을 구현하면서

사용자 인증을 하는 방법은 쿠키나 세션을 사용 하는 법 등 

다양한 방법이 있는데, 최근 많이 사용하고 있는

JWT (Json Web Token)를 통해 NodeJs Express 환경에서

로그인 RestAPI를 구현하면서 토큰을 통한 사용자 인증

예제를 통해 알아보기로 한다

 

⭐️ 구동 로직

Express를 통한 로그인 Rest API 내 

JWT (Json Web Token) 모듈을 이용한

사용자 인증 방식

 

 🌈 로그인 예제

회원 가입 : 비밀번호 암호화 및 회원 정보 토큰생성하여

클라이언트에게 json 전송

(비밀번호 암호화는 bcrypt 모듈 사용, 하단 링크 참조)

https://goodmemory.tistory.com/137

 

로그인 : 클라이언트 헤더 내 토큰을 통하여

회원 인증하여 회원 정보 출력

 

import express from 'express';
import helmet from 'helmet';
import cors from 'cors';
import bcrypt from 'bcrypt';
import jwt from 'jsonwebtoken';

const app = express();
app.use(helmet());
app.use(cors());
app.use(express.json());
app.use(express.urlencoded({extended:false}));

const users = [];
//JWT 토큰 생성시 필요한 Secret키, 
//원하는 Secret 키로 변경 가능
const jwtSecret = 'JsonWebTokenSecret';

//회원가입시
app.post('/join',async (req,res)=>{
    const {id, password, url} = req.body;
    const user = users.find(u=>u.id === id);
    if(!user) { //가입된 정보가 없을때 (회원가입)
        const hashed = await bcrypt.hash(password,10);
        //클라이언트 측으로 부터 받은 회원 정보 저장
        const newUser = {
            id, password:hashed,url
        };
        users.push(newUser);
        //저장된 회원정보 JWT를 통해 Token 생성
        const newUserToken = jwt.sign({id,url},jwtSecret,{
            expiresIn : 60 * 60     //60초 * 60 이므로, 1시간 유효한 토큰 발급
        });

        //Json 응답을 통해 메시지와 JWT를 통해 생성한 토큰 전달
        return res.status(200).json({
            msg : '회원가입 성공!!',
            token : newUserToken 
        });


    }else {//이미 가입된 정보가 존재할때 (msg)
        return res.status(400).json({msg : '이미 같은 아이디가 존재합니다'});
    }
});

//회원 인증
app.get('/me',(req,res)=>{
    //클라이언트 요청시 헤더값에 포함된 토큰값 분석
    let auth = req.get('Authorization');
    const userToken = auth.split(' ')[1];

    //토큰을 통해 회원 인증
    jwt.verify(userToken,jwtSecret,(err,encode)=>{
        if(err) console.error(err);
        else {
            console.log(encode);
        }
    });
});

//로그인
app.post('/login',async(req,res)=>{
    const {id, password} = req.body;
    const user = users.find(u=>u.id === id);
    if(!user) {
        return res.status(400).json('아이디 없음');
    } else {
        const isEqualPw = await bcrypt.compare(password,user.password);
        console.log(isEqualPw);
        if(isEqualPw) 
            return res.status(200).json({msg : "로그인 성공!",user});
        else 
            return res.status(404).json({msg : "로그인 실패"});
    }
});

app.listen(8080,()=>console.log('http://localhost:8080'));

 

PS 해당 예제는 JWT의 사용 예시를 나타내기 위해 

클라이언트 측의 데이터를 가공하거나 검증하는 코드가 추가되지 않았음

 

JWT는 State가 없는 대신 Json을 통해 

회원 정보를 주고 받고 인증하기 때문에

꼭 필요한 정보만 최소화 하여 가공할것!

728x90

댓글