JWT


JWT란

JWT는 JSON Web Token의 약자로, JSON 데이터 구조를 암호화하는 방법으로 RFC7516 표준이다.
주로 인증을 위해 사용되고, 보안을 위해 데이터 변환을 하는데도 사용된다.

JWT는 세 부분으로 나뉘며, 각 파트마다 .을 통해 나누어진다. 맨 앞에서부터 순서대로 header, payload, sinature로 구분된다.

  • header : 토큰의 타입과 해시 암호화 알고리즘으로 구성되어 있다. 첫째는 토큰의 유형 (JWT)를 나타내고, 두 번째는 HMAC, SHA-256, RSA와 같은 해시 알고리즘을 나타낸다.
  • payload : 토큰에 담을 정보를 포함하고 있다. 사용자의 구분이 가능하도록 사용자의 정보나 토큰의 만료기간을 담는다.
  • sinature : header, payload를 인코딩한 값을 합친 뒤, secret key를 통해 해시한다.

JWT 설치 및 사용

    npm install jsonwebtoken --save-dev

위 명령어를 통해 jwt를 설치한다.


jwt.sign() 메소드를 통해 토큰을 생성할 수 있다. 함수에 들어가는 인자는 다음과 같다.

  • userinfo: 아이디, 비밀번호 등 사용자 정보가 들어간 객체. 비밀번호는 위험하니 아이디를 넣는걸 권장한다.
  • secretKey: 여러가지 복잡한 문자열로 된 키. 임의의 복잡한 문자열을 키로 정한다.
  • options: 토큰에 대한 여러가지 정보를 설정한다. expiresin은 토큰 만료일. issuer, subject는 토큰에 대한 정보이다. 그 외에 option도 존재한다.
  • 익명함수: token을 콜백함수로 받을 수 있으므로 주로 token을 프론트단에 json형식으로 응답하는 코드를 작성한다.


사용자는 서버에게 요청을 보낼 때, request.Header에 토큰을 포함하여 요청을 보낸다. 위의 코드에서는 프론트에서 x-auth-token이라는 이름으로 header에 token을 포함시켜 요청을 보내왔기에 token을 header에서 가져온 모습이다. jwt.verify()는 검증과 동시에 token의 decode된 결과를 json 형식으로 반환한다. jwt.verify() 메소드를 통해 토큰의 유효성을 검사할 수 있다. 함수에 들어가는 인자는 다음과 같다.

  • token: client에서 받은 token
  • secretkey: token 생성 시 사용했던 secret key
  • 익명함수: 유효성 검사 결과를 처리할 콜백함수. decode된 token을 json 형식으로 decoded라는 인자에 받을 수 있다.

JWT 장단점

장점

  • 사용자 인증에 필요한 정보는 토큰에 포함하므로, 별도의 인증 저장소 필요 X
  • 분산 마이크로 서비스 환경에서 인증 서버와 DB에 의존하지 않는 쉬운 인증 방법
  • 트래픽에 대한 부담이 낮다
  • REST 서비스로 제공 가능
  • 내장된 만료기간

단점

  • 토큰은 클라이언트에 저장되어 DB에서 사용자 정보를 변경해도 반영할 수 없다.
  • 더 많은 필드가 추가되면 토큰이 커질 수 있다.

Reference

http://www.opennaru.com/opennaru-blog/jwt-json-web-token/
https://helloinyong.tistory.com/111

You might also enjoy