개발 일기

JWT 사용자 인증 구현 본문

서버/Node.js

JWT 사용자 인증 구현

이건욱

JWT (Json Web Token)?

그동안 많은 서비스들은 사용자 인증을 구현하기 위해서 다양한 방법을 적용하였습니다.

오늘은 JWT에 대해서 설명하도록 하겠습니다.

 

JWT는 Session / Cookie 방식과는 다른 Token 기반의 인증 방식 입니다.

 

Session / Cookie 방식에 대해서 간단하게 설명을 하자면 아래와 같은 순서대로 이루어지게 됩니다.

 

1) 사용자 로그인

2) 서버에서 사용자를 확인 후에 사용자의 고유 ID를 발생 후 세션 저장소에 저장후에 , 이와 연결되는 세션 ID를 발행

3) 사용자는 해당 값을 Cookie에 저장한 후에 요청을 할때마다 세션ID를 보냅니다.

4) 서버에서 해당 값을 받아서 세션 저장소에서 확인을 한 후에 정보를 가져옵니다.

5) 인증이 완료 후 권한이 허락된 사용자에게 해당 정보를 보여줍니다.

 

JWT 방식은 위와 방식과는 다르게 사용자 정보를 JSON을 담아서 이를 암호화를 한 후에 해싱 작업을 거쳐서 문자열 토큰을 발행하게 됩니다.

 

따라서 JWT는 서버에 저장하지 않기 때문에 관련 저장소가 필요하지 않으며 , 해싱을 통해 데이터 무결성을 보장하는 인증 방식입니다.

 

Node JS에서는 "jsonwebtoken"이라는 좋은 라이브러리를 제공합니다.

 

아래는 해당 예시입니다.

router.post("/signup"), async(req , res ,next) => {
	try {
		const salt = await bcrypt.genSalt(10);

		const hash = await bcrypt.hash(req.body.user_pass, salt);
		
        let id = await Auth.createUser()
        // 해당 토큰 내용(payload) 값은 알수 있기때문에 사용자의 중요한 정보를 안하는것이 좋습니다. 
		const token = jwt.sign({id : id}, app.get('secret') // 비밀키 , {
            		expiresIn: '7d' // 유효시간
		});
		
        res.cookie("auth", token,{ maxAge: 1000 * 60 * 10, httpOnly: true });
        // 원하시는 응답값 하시면 됩니다!
        res.json({token})
    } catch (error) {
   		// 원하시는 에러 메시지 노출
		res.json({error : "INTERNET SERVER ERROR"})
	}
})

 

인증하실때에는 아래와 같이 할수가 있습니다.

async (req, res, next) => {
    const token = req.cookies['auth']; // Header Token 

    if (token) {
        try {
            const user = jwt.verify(token, app.get('secret') // 비밀키);
			
            // JWT에 대한 사용자의 정보로 가져옵니다.
            req.user = await Auth.getUserId(user['id']);

            if(req.user){
                return next();
            }else {
                return next(new Error('User has been deleted'))   
            }
        } catch (error) {
            return next(new Error('jwt Parsing Error'));
        }
    }

    return next(new Error('No token provided'));
}

추가적으로 sign() 함수는 HMAC SHA256 알고리즘을 사용합니다.

해당 알고리즘을 변경하고 싶을때에는 여기를 클릭해 주세요.

 

 

'서버 > Node.js' 카테고리의 다른 글

Graphql ?  (0) 2020.08.13
TypeGraphQL ?  (0) 2020.06.05
Sequelize-cli 간단한 사용방법  (0) 2020.05.29
mongoose query builder ?  (0) 2020.05.28
mongoose ?  (0) 2020.05.27
Comments