본문 바로가기

개발/Node.js

[JWT in Node.js] JWT (json web token) 이란?

 

JWT (json web token) 이란? 


 

웹을 배우기 시작했을 무렵 session 과 cookie 를 이용한 로그인기능을 배웠다.

하지만 요즘은 대세가된 페이스북이나 카카오 등 소셜로그인 기능은 위의 방식과 다른 토큰방식의 로그인 기능을 제공한다. 

따라서 이번에는 JWT(json web token) 에 대하여 알아보았다

먼저 JWT 에 대하여 알아보고 이후 Node.js 와 함께 사용하는 방법을 알아보도록 하겠다.

 

아래 내용은 스터디에서 발표를 위해 작성한 내용입니다. 

참조 :  https://jwt.io/introduction/

 

JWT(JSON WEB TOKEN) 이란?

  • 개체간 JSON 사용하여 정보를 안전하게 전송하기 위한 독립적(self-contained) 이고  컴팩트한 웹표준(RFC 7519)이다.
  • 디지털 서명(digitally signed) 되어있기 때문에 신뢰(trusted)할수있다 
  • JWT 암호화(with the HMAC alsorithm) 사용하거나 public/private key pair RSA or ECDSA 사용한다 

JWT 는 언제 쓰이는가?

  • 권한 :  유저가 로그인 하면 모든 요청에 jwt 포함하여 해당 token 으로 허용된 service, routes, resource 엑세스한다.
    SSO(single sign on)
    적은 오버헤드와 다른 도메인을 서로 쉽게 사용할 있기때문에 최근 JWT 널리 사용되고 있다. 
  • 정보교환 : JSON Web Tokens 개체간 암호화된 정보를 전송하는데 좋은 방법이다. 공개/개인키 쌍을 사용하여 JWT 서명할 있기때문에 발신자가 자신이 누구인지 확인할 있다. 또한 서명은 헤더와 페이로드를 사용하여 계산되므로 내용이 변경되지 않았는지 확인할 있다. 

공개/개인키(Public/Private Key) 구조란 ?

  • 정보를 보내는사람(Sender) 과 받는사람(Recipient) 이 있다고 가정한다. 
  • 보내는사람은 "ABC" 라는 문자열을 보내기 위해 
  • 정보교환 : JSON Web Tokens  개체간 암호화된 정보를 전송하는데 좋은 방법이다. 공개/개인키 쌍을 사용하여 JWT 서명할  있기때문에 발신자가 자신이 누구인지 확인할  있다. 또한 서명은 헤더와 페이로드를 사용하여 계산되므로 내용이 변경되지 않았는지 확인할  있다.

JWT 의 구조

  • Header (헤더)
  • Payload (내용)
  • Signature (서명)
  • Header . Payload . Signature 

Header

  • 헤더는 일반적으로 두개의 부분으로 구성된다.
  • 토큰 유형, 서명 알고리즘
{ 
    "alg" : "HS256", 
    "typ" : "JWT" 
}

 

Payload

  • 페이로드는 클레임(craim) 포함하고있다.
  • 클레임은 개체(일반적으로, 사용자) 추가적인 데이터의 진술이다.
  • Registered claims : 미리 정의된 클레임으로 필수적인 요소는 아니지만 권장하고있다. 
  • Public claims (공개 클레임)
    • 미리 정의된 클레임이 아닌 추가적인 클레임
    • 미리 정의된 클레임과 충돌방지(collsions registant) 위해 URL 형식으로 정의한다 (: “http://example.com/jwt_claims/is_admin“ : “true") 
  • Private claims (비공개 클레임)
    • 정보를 공유하는 개체간 ( 보통 서버-클라이언트 ) 서로 동의하에 생성하는 클레임 (:  “username” : “beomun”)
  • Claim example
{ 
	"iss": "http://example.org",
	"aud": "https://exmple.com",
	"exp": "1407019629",
	"http://example.com/jwt_claims/is_admin" : "true",
	"username": "beomun"
 }

 

Signature

  • signature(서명) 인코딩된 header payload 합쳐 header 서명 알고리즘 정보를 가져와 암호화하여 생성한다
  • 만약 헤더정보의 알고리즘이 HS256 경우 아래와 같이 서명이 생성된다.
  • 서명은 메세지가 변경됬는지 검증하기 위해 사용된다. 또한 개인키로 암호화된 토큰은 발신자가 누구인지 확인할 있다.

HMACSHA256(
  base64UrlEncode(header) + “.”+
  base64UrlEncode(payload),
  Secret)
 

 

JWT 구조 확인

 

Jwt 동작방식

  • 인증시 유저가 로그인에 성공하면 JSON 토큰이 반환된다.
  • 사용자가 보호된 라우트 또는 리소스에 접근하고자 일반적으로 Bearner 스키마 사용하여 Authorization 헤더에 jwt 함께 보낸다. 
  • 서버의 보호된 라우트는 Authorization 헤더에 있는 jwt 체크하고 확인되면 유저는 보호된 리소스에 엑세스 있다.
  • Authorization 토큰은 쿠키를 사용하지 않기때문에 CROS(cross origin resource shering )  이슈가 발생하지 않는다.

 

 

다음번에는 Node.js 에서 JWT 을 발급받고 확인하는 방법에 대하여 알아보도록 하겠습니다.