
Javascript Object Notation, 데이터를 주고받기 위해 사용하는 경량의 데이터 형식 중 하나
JSON은 Javascript 객체 문법으로 구조화된 데이터를 표현하기 위한 문자 기반의 표준 포맷이다. 웹 어플리케이션에서 데이터를 전송할 때 일반적으로 사용한다. 문자열 형태로 존재하며, JSON 형식에서는 키와 값의 쌍으로 이루어진 데이터 객체를 사용한다
{
"id" : "gildong",
"password" : "1234",
"age" : "30",
"job" : [
{
"name" : "programmer",
"year" : "2015"
},
{
"name" : "dancer",
"year" : "2018"
}
]
}

인증에 필요한 정보를 암호화한 JSON 형식의 토큰
JWT는 인증과 인가에 일반적으로 사용되는 토큰의 일종이다. 인증에 필요한 사용자 정보를 암호화하여 자체적으로 포함한다는 특징이 있다.
사용자 정보뿐만 아니라 암호화된 서명을 포함하고 있어 무결성도 검증가능하다.
JSON 형태의 사용자 데이터를 URL에 대해 안전한 문자열(Base64 URL-safe Encode)로 인코딩하였기 때문에 어떤 경로로든 전송이 가능하다.
JWT 토큰을 HTTP헤더에 실어 서버가 클라이언트를 식별할 수 있도록 한다.
xxxxx.yyyyy.zzzzz, X:[Header] / Y:[Payload] / Z : [Signature]

나중에 사용자(Client)는 자신이 받았던 JWT 토큰을 다시 서버에 전달한다.
서버는 (헤더 + 페이로드 + 서버 내에 있는 키(Key))를 해싱한 값이 사용자로부터 전달받은 것과 일치하는지 체크한다.
이 과정에서 서버가 가지고 있는 비밀키(secret key)를 사용한다.
사용자는 서버가 처음에 부여했던 권한만큼의 작업을 요청할 수 있다.
데이터를 변경하면 해시 값이 변경되므로, 악의적인 공격자가 Payload를 수정하는 것이 불가능하다.
예를 들어 사용자의 등급이 1,2,3,4,5일 때 5등급의 사람이 1등급으로 Payload를 변경해 보냈다고 해보자. 이 경우, 서버의 키를 모르므로, 서명 값이 일치하지 않아 서버가 위조 여부를 알 수 있다.