JSON Web Token이란 무엇일까?
웹에서 인증을 구현할 때, 세션 기반 인증을 선택하거나 JWT를 사용한 인증 방법을 선택합니다.
여기서 사용되는 JWT가 정확히 무엇인지 알아보겠습니다.
우선 RFC 7519에 정의된 JSON Web Token을 알아보겠습니다.
JSON Web Token (JWT)은 두 당사자 간에 전달될 클레임을 나타내는 간결하고 URL에 안전한 수단이다.
JWT의 클레임은 JSON 객체로 인코딩 되어 JSON Web Signature(JWS) 구조의 페이로드 또는 JSON Web Encryption(JWE) 구조의 평문으로 사용되며, 이를 통해 디지털 서명 또는 무결성 보호(Message Authentication Code(MAC) 및/또는 암호화)가 가능합니다.
간단하게 해석하면 상대방 간의 정보를 전달할 수 있는 수단이라고 할 수 있습니다.
JWT의 구조
여기 jwt.io라는 사이트에서 제공하는 예시가 있습니다.
JWT은 정보를 담아 BASE64로 인코딩하는데, 이를 디코딩하면 위 사진의 오른쪽처럼 정보를 담고 있습니다.
JWT의 "."은 Header, Payload, Verify Signature을 구분하는 역할을 하고 있습니다.
"."에 따라서 구분된 빨간색을 BASE64로 디코딩하면 시그니처에 사용된 암호화 알고리즘의 정보가 있는 JSON이 나오고, 보라색을 디코딩하면 개발자가 추가로 담은 정보가 있는 JSON이 나옵니다.
그렇다면 시그니처는 무엇이고 왜 필요할까요?
JWT 토큰에 시그니처가 왜 있는지 이해하려면 세션 기반 인증과 JWT 기반 인증을 예시로 들면 알 수 있습니다.
세션 기반 인증은 사용자가 로그인 요청을 하면 로그인 정보를 검증하고, 유효한 사용자면 세션 ID를 발급해서 데이터베이스에 저장하고 이를 사용자에게 반환합니다.
이후 사용자가 인증정보가 필요한 요청을 하면 Session ID를 데이터베이스에 저장된 Session ID와 비교하여 응답을 합니다.
즉, 세션 기반 인증은 인증 데이터가 서버에 저장돼있다는 특징이 있습니다.
JWT를 기반으로 한 인증은 사용자가 로그인 요청을 하면 로그인 정보를 검증합니다. 로그인 정보가 유효하면 서버에 저장돼 있는 비밀키를 사용해서 토큰을 생성하고 이를 사용자에게 반환합니다.
사용자는 토큰을 브라우저 스토리지나 메모리에 저장하여 인증정보가 필요한 요청의 헤더에 담아 서버로 보냅니다.
서버는 앞서 비밀키로 서명된 정보가 변조가 되었는지 확인하고 변조가 안되었으면 정상 응답을 합니다.
이 때 서버가 확인하는 서명정보가 Verify Signature입니다.
Verify Signature의 구성요소는 앞선 jwt.io의 예시에서 확인할 수 있습니다.
Verify Signature은 BASE64로 인코딩된 헤더 + BASE64로 인코딩된 페이로드 + 비밀키를 암호화 알고리즘으로 암호화한 값입니다.
참고 및 인용
https://datatracker.ietf.org/doc/html/rfc7519
RFC 7519: JSON Web Token (JWT)
JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is used as the payload of a JSON Web Signature (JWS) structure or as the plaintext of a JS
datatracker.ietf.org
JWT.IO
JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.
jwt.io