Json Web Token (JWT)
JWT는 클라이언트와 서버간의 인증과 정보 교환을 안전하게 수행하기 위한 표준 방법이다.
정보를 안전하게 전달하기 위해 "전자 서명"된 JSON 객체로 표현된다.
전자 서명 ?
전자 서명이란 {헤더}, {페이로드}와 시크릿 키를 이용해 해시 함수에 돌린, 즉 암호화한 결괏값이다.
시크릿 키란 나만 알고있는 문자열, 비밀번호 같은 것이다.
너무 간단하지 않으면 아무거나 상관없다.
JWT는 총 3가지 부분으로 구성된다.
1. 헤더 (Header)
JWT의 헤더는 토큰의 유형 및 서명 알고리즘을 지정한다.
헤더는 JSON 객체로 표현되며, 일반적으로 두개의 속성을 가진다.
2. 페이로드 (PayLoad)
3. 서명 (Signature)
JWT의 인증 과정을 로그인을 예로 들어 설명하면,
최초 로그인 시 서버는 사용자의 아이디와 비밀번호를 서버에 저장된 비밀번호에 비교해 인증한다.
인증된 사용자인 경우, 사용자의 정보를 이용해 {헤더}.{페이로드} 부분을 작성한다.
자신의 시크릿 키로{헤더}.{페이로드} 부분을 전자 서명한다.
전자 서명의 결과로 나온 값을 {헤더}.{페이로드}{서명}으로 이어붙이고,
Base 64로 인코딩 한 후 반환한다.
이후 누군가 이 토큰으로 리소스 접근을 요청하면
서버는 이 토큰을 Base64로 디코딩해서 얻은 JSON을
{헤더}{페이로드} 와 {서명} 부분으로 나눈다.
서버는 {헤더}.{페이로드}와 자신이 갖고 있는 시크릿키로 전자 서명을 만든 후 ,
방금 만든 전자 서명을 HTTP 요청이 가지고온 {서명}부분 과 비교하여 유효성을 검사한다.
서버가 방금 시크릿키를 이용해 만든 전자서명과 HTTP 요청의 {서명} 부분이 일치하면
토큰이 위조되지 않았다는 뜻이다.
누군가 토큰을 훔쳐가면 어떻게 될까?
토큰을 훔쳐가면 당연히 해당 계정의 리소스에 접근할 수 있게 된다.
그렇기 때문에 반드시 HTTPS(SSL/TSL)를 통해 통신해야한다.
HTTPS는 HTTP의 보안버전으로,
암호화된 통신을 제공하여 데이터의 기밀성과 무결성을 보호한다.