concept
모바일이나 웹의 사용자 인증을 위해 사용하는 암호화된 토큰으로,
JWT 정보를 request에 담아 사용자용 정보 열람, 수정 등 개인적인 작업을 수행할 수 있게 한다.
Json 형태의 데이터를 네트워크를 통해 서로 다른 장치끼리 안전하게 전송하기 위해 설계 되었다.
JWT 과정
세 파트로 나뉘며, 각 파트를 .(점)으로 구분하여 aaaaa.bbbbbb.cccc 의 형식으로 표현된다.
JWT는 URL에서 파라미터로 사용할 수 있도록 URL_Safe 한 Base64Url 인코딩을 사용한다.
1. header
토큰의 타입과 해시 암호화 알고리즘으로 구성되어 있다.
{
"alg" : "HS256",
"typ" : "JWT"
}
2. payload
토큰에 담을 정보
여기에 담은 정보의 한 조각을 claim 이라 부른다.
{
"sub" : "1234567890",
"name" : "example",
"eamil" : "example@ex.com"
}
3. signature
payload와 secret key를 알고리즘에 입력으로 넣으면 signature가 생성.
이것을 client에게 전달한 후에 서버는 위의 과정을 저장하지 않고 secret key만 저장한다.
후에 client에서 내용을 전달하면, header의 알고리즘을 사용하여 payload와 서버에 저장된 secret key를 조합해 서명을 생성한다.
새로 생성된 서명이 client에서 보낸 서명과 동일한지 확인한다.
쿠키 기반 인증 VS JWT 토큰 인증
쿠키 기반 인증
- 사용자 로그인 시도
- DB 데이터 조회
- 임시 비밀번호인 session id를 반환
- 반환된 session id를 브라우저 쿠키 값으로 받음
클라이언트가 접속할 때마다 session table을 확인 해야 하며,
새로 접속할 때마다 새로운 session id를 발급해야 한다. -> DB 부하
JWT 토큰 인증
- 사용자 로그인 시도
- DB 데이터 조회
- 서버는 시크릿 키와 페이로드를 사용하여 서명을 생성.
- 헤더, 페이로드, 서명을 base64로 인코딩하여 반환
- 클라이언트는 반환된 JWT를 쿠키나 로컬스토리지에 저장
- JWT를 base64로 디코딩하면 실제 정보로 되돌릴 수 있다.
발급된 토큰값만 확인하기 때문에 서버의 부담이 줄어든다.