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 : 미리 정의된 클레임으로 필수적인 요소는 아니지만 권장하고있다.
- Iss (issuer) : 토큰 발행자
- exp(expiration time): 만료시간
- sub(subject) : 토큰 제목
- Aud(audience) : 토큰 대상자
- 참조 : https://tools.ietf.org/html/rfc7519#section-4.1
- 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 을 발급받고 확인하는 방법에 대하여 알아보도록 하겠습니다.
'개발 > Node.js' 카테고리의 다른 글
[Node.js] Node.js 무료 Editor Atom 설치 및 Node.js 샘플코드 작성 (1) | 2018.06.08 |
---|---|
[Node.js] Node.js 설치하기 (Windows10) (4) | 2018.06.08 |