관리 메뉴

SIMPLE & UNIQUE

JWT(JSON Web Token)/npm jsonwebtoken 본문

React & Node/Guide

JWT(JSON Web Token)/npm jsonwebtoken

착한코딩 2019. 11. 1. 15:34

jwt.js

(git에 추적되지 않게 .gitignore 파일에 등록하고, 파일은 ftp로 직접 서버에 올려서 관리한다.)

let jwtObj = {};

//비밀키 세팅
jwtObj.secret = "sdf8i3dsklk33ksd"

module.exports = jwtObj

암호화 복호화 modules.js

let jwt = require("jsonwebtoken");
let secretObj = require("../ignorefile/jwt");

      //암호화
      let token1 = jwt.sign({
        email: userid   // 토큰의 내용(payload)
      },
      secretObj.secret ,    // 비밀 키
      {
        expiresIn: '60m'    // 유효 시간은 60분
      })
      
      //복호화
      let decoded1 = jwt.verify(token1, secretObj.secret);

로그인 세션 유지를 위해 cookie값으로 jwt를 사용하였다.

https://www.npmjs.com/package/jsonwebtoken

 

 

 

 

  데이터 구조를 보면

Header에 데이터 타입과 암호화 알로리즘정보

Payload에 데이터 내용(위 코드에서는 email)

Signature에는 서명이 들어간다.

 

  위 코드를 실행하면 토큰이 정상적으로 발행된다.

그런데 발행된 토큰을 아래 사이트에 입력하면 비밀키를 입력하지 않아도 복호화 된다.

https://jwt.io/

 

  결론적으로, headerpayload를 암호화되지 않는다. 이 영역은 단순히 Base64 URL Encoding 된다.

비밀키의 역할은 signature영역을 암호화하여, 전달된 토큰이 신뢰할 수 있는지 확인하는 것이다.

해커가 payload안에 있는 데이터를 알아도, 서명을 모르기 때문에 사이트에서 발행하는 토큰을 그대로 재현할 수 없다.

 

  payload 안에 데이터도 암호화한다면 더욱 좋겠지만, 이 정도 수준으로도 쿠키값을 만들어 로그인을 하려는 시도는 막을 수 있을 것 같다. 

  가공되어 있는 쿠키값을 가져간다면 로그인처리가 가능하겠지만, 쿠키 세팅시 httponly 옵션을 주면 사이트 밖에서 쿠기를 가져가려는 요청을 막을 수 있다. (아래 링크참고)

https://leejungyeoul.tistory.com/76?category=649935

 

 

 

 

 

 

 

Comments