티스토리 뷰

안녕하세요, 해당 글은 JWT라는 토큰의 정의와 사용하는 이유, 상용하는 상황, 내용 형식 마지막으로 JWT의 장단점에 대해서 알아보려고 합니다. 

 

우선, 공식 홈페이지에서는 JWT를 이렇게 설명합니다.

 

JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.

공식 홈페이지 이동

 

JWT의 정의

JWT (JSON Web Token)는 개방형 표준 (RFC 7519)으로 당사자간에 정보를 JSON 객체로 안전하게 전송하기 위한 간결하고 독립적인 방법을 말합니다. 이 정보는 디지털 서명되어 있으므로 확인하고 신뢰할 수 있습니다. JWT는 비밀 (HMAC 알고리즘 사용) 또는 RSA 또는 ECDSA를 사용하는 공개 / 개인 키 쌍을 사용하여 서명 할 수 있습니다. JWT를 암호화하여 당사자 간의 보안을 제공 할 수도 있지만 서명 된 토큰에 중점을 둡니다. 서명 된 토큰은 그 안에 포함 된 클레임의 무결성을 확인할 수있는 반면 암호화 된 토큰은 해당 클레임을 다른 당사자로부터 숨깁니다. 공개 / 개인 키 쌍을 사용하여 토큰에 서명하면 서명은 개인 키를 보유한 당사자만 서명한 당사자임을 인증합니다.

 

JSON 형태를 사용하는 이유는 무엇일까요?

SWT (Simple Web Tokens) 및 SAML (Security Assertion Markup Language Token)과 비교할 때 JSON 웹 토큰 (JWT)의 이점에 대해 이야기하겠습니다.

1) JSON이 XML보다 덜 장황하므로 인코딩 될 때 크기도 작아져 JWT가 SAML보다 더 컴팩트합니다. 따라서 JWT를 HTML 및 HTTP 환경에서 전달하는 것이 좋습니다.

2) 보안 측면에서 SWT는 HMAC 알고리즘을 사용하여 공유 비밀로만 대칭적으로 서명 할 수 있습니다. 그러나 JWT 및 SAML 토큰은 서명을 위해 X.509 인증서 형식의 공개 / 개인 키 쌍을 사용할 수 있습니다. 모호한 보안 허점을 도입하지 않고 XML 디지털 서명으로 XML에 서명하는 것은 JSON 서명의 단순성과 비교할 때 매우 어렵습니다.

3) JSON 파서는 객체에 직접 매핑되므로 대부분의 프로그래밍 언어에서 일반적입니다. 반대로, XML에는 자연스러운 문서 간 매핑이 없습니다. 따라서 SAML 어설 션보다 JWT 작업이 쉬워집니다. 사용법과 관련하여 JWT는 인터넷 규모로 사용됩니다. 이는 여러 플랫폼, 특히 모바일에서 JSON 웹 토큰의 클라이언트 측 처리 용이성을 강조합니다.

 

JWT를 사용 하는 상황은 언제일까요?

보통, 회원 인증을 위해  많이 사용합니다. 웹페이지에서 로그인을 하는 경우 혹은 개인 정보에 관련된 통신을 하는 경우에 사용 합니다. 즉, 정보  교류 : 해당 정보가 누가 보낸것인지, 올바른 정보인지 확인을 위해 사용합니다. 실제로 많은 웹 사이트에서 로그인 등의 과정에서 많이 사용중에 있습니다. 물론, 회원 인증 방식에 JWT만 있는 것은 아니고 그중 한 종류입니다.

 

JWT의 장점은 무엇일까요?

- 토큰을 사용하면 세션을 통한 방식과 달리 서버측 부하를 낮출 수 있고 능률적인 접근 권한 관리를 할 수 있으며 분산/클라우드 기반 인프라스트럭처에 더 잘 대응할 수 있습니다.

- 별도의 인증 저장소가 필요가 없다. 그래서 인증 서버와 DB에 의존하지 않아도 된다. 

 

JWT의 단점은 무엇일까요?

- 저장할 필드 수에 따라서 토큰이 커질 수 있다.

- 토큰이 모든 요청에 대해 선송되면 데이터 트래픽 크기에 영향을 미칠 수 있다.

 

 

마지막으로 JWT의 형식을 알아보도록 하겠습니다. 

JWT의 형식

출처 : https://www.hahwul.com/2016/01/web-hacking-jwtjson-web-token-jwt-test.html

Header : 헤더

헤더는 토큰  타입 비정하고, 해싱 알고리즘 지정 합니다. 토큰 타입은 JWT이고, 해싱 알고리즘은 SHA256 혹은 RSA가 사용됩니다. 

 

Payload : 정보

토큰에 담을 정보(클레임)가 들어있습니다. 

종류 : 등록된 클레임, 공개된 클레임, 비공개 클레임

 

Signature : 서명

헤더의 인코딩 값과 정보의 인코딩 값을 합친 후 비밀키로 해쉬를 하여 생성한다. 

 

읽어주셔서 감사합니다.

 

참고 

https://jwt.io/introduction/

https://velopert.com/2389

http://www.opennaru.com/opennaru-blog/jwt-json-web-token/

댓글