Node

[Node] JWT 토큰 구현

효진인데요 2023. 11. 3. 16:52

 

 

 

JWT란?

 

  • Json Web Token
  • Json 포맷을 이용하여 사용자에 대한 정보를 저장하는 웹 토큰
  • 토큰 자체를 정보로 사용하는 방식
  • 주로 회원 인증이나 정보 전달에 사용

 

 

[ 구조 ]

 

 

출처:https://mangkyu.tistory.com/56

 

1) Header (헤더)

  • typ : 토큰의 타입 (ex. JWT)
  • alg : 해싱하기 위한 알고리즘 방식 (ex. SHA256, HS256 등)

 

2) PayLoad (페이로드)

  • 토큰에서 사용할 정보들인 Claim (클레임)이 담겨있음

 

Registered Claim (등록된 클레임)
  • 토큰 정보를 표현하기 위해 이미 정해져 있는 종류의 데이터
  • 선택적 작성이 가능
issuer 토큰 발급자
subject 토큰 제목
audience 토큰 대상자
expiration 토큰 만료 시간
not before 토큰 활성 날짜
issued at 토큰 발급 시간
JWT ID 토큰 식별자

 

 

3) Signature (서명)

  • 토큰을 인코딩하거나 유효성 검증을 실행할 때 사용하는 고유한 암호화 코드
  • 헤더와 페이로드의 값을 각각 인코딩 한 뒤, 해당 값을 비밀 키를 이용해 헤더에서 정의한 알고리즘으로 해싱

 

 

 

 

1. 구현



저번 프로젝트에서는 세션을 통해 사용자의 로그인 상태 등의 정보를 관리하고 사용했다.

이번에는 저번 프로젝트와의 차별점을 두기 위해 토큰을 사용해 보면 좋을 것 같아 JWT를 배워 개발을 진행해보았다.

 

 

config/secretkey.js

 

우선 config 파일 안에 secretkey.js 파일을 생성,

위와 같이 토큰을 생성할 알고리즘과 유효시간, 발행자 등을 지정해 주었다.

JWT 비밀 키는 .env 파일에 넣어 노출되지 않도록 하여 보안성을 높였다.

 

 

 

 

 

 

토큰을 생성하는 부분은 modules 폴더 안의 jwt.js 파일에 작성해 두었다.

 

modules/jwt.js

 

 

sign 메소드에서 payload 부분을 보면 확인할 수 있는 것처럼,

사용자의 이름, 이메일, uSeq (db에서 pk값)을 토큰에 포함시키도록 하였고, 

앞서 secretkey.js에 정의해 두었던 시크릿키와 옵션을 활용하여 토큰을 발행하는 데에 사용했다.

 

 

verify 부분은 토큰을 검증하는 부분인데, 암호화된 토큰을 디코딩하는 역할을 한다.

 

 

 

 

 

 

토큰 검증을 받은 뒤 사용할 수 있는 페이지나 기능들에 대해 쉽게 관리할 수 있도록 미들웨어로 빼두었다.

middlewares 폴더를 생성하여, 그 안에 auth.js 파일을 통해 토큰을 검증할 수 있도록 했다.

 

middlewares/auth.js

 

여기에서는 checkToken 메서드를 통해 헤더에 들어있는 토큰을 가져와 토큰을 추출하고,
토큰의 유효성을 검증하는 로직을 구현했다.

 

 

토큰 만료, 유효하지 않는 토큰, undefined 토큰 등 오류를 잡아내며,

토큰이 정상적으로 존재하는 경우에는 jwt.js 파일에 있던 verify 함수를 통해 디코딩된 값을 콘솔에 찍어 확인해 보았다.

 

 

 

 

 

이런 식으로 한 번 split을 하는 이유는 req.headers.authorization를 콘솔에 찍어보게 되면 쉽게 확인할 수 있는데,

토큰을 발급받게 되어 req.headers.authorization을 살펴보면

req.headers.authorization

이렇게 찍히게 된다.

 

 

이유는?

 

일반적으로 토큰은 요청 헤더의 authorization 필드에 담아 보내지게 되는데,

토큰 앞에 붙는 Bearer는  JWT 혹은 OAuth에 대한 토큰 인증 타입이다.

 

따라서 토큰만 온전히 분리하여 디코딩하고 활용하기 위해 split으로 앞의 타입을 떼어내는(?) 작업인 것이다.

 

 

 

 

디코딩된 토큰을 찍어보면

 

 

이렇게 페이로드에서 설정했던 값들을 확인할 수 있다.

 

 

 

 

 

 

 

미들웨어 활용법과 포스트맨에서 사용하는 법은 다음에 정리하도록 하겠다.

 

 

 

728x90