[ETC] Jwt 구성, 헤더, 페이로드
출저 및 참고 사이트 :
https://mangkyu.tistory.com/56
JWT (Json Web Token)
- Session DB를 사용하지 않고, 오로직 토큰을 주고받는 식으로만 유저의 인증을 처리한다.
JWT 구성
- JWT의 큰 틀은 다음과 같이 구성된다.
- 헤더 (HEADER)
- 페이로드 (PAYLOAD)
- 서명 (SIGNATURE)
헤더 (HEADER)
- 헤더의 구성요소
- typ : 토큰의 타입을 지정
- alg : Sginature를 해싱하기 위한 알고리즘을 지정
예시)
\{ "alg':"HS256", "typ":JWT }
페이로드 (PAYLOAD)
- 토큰에서 사용할 정보의 조각들인 클레임이 담겨있다.
- 클레임은 총 3가지로 나뉘어지며 Key : Value 형태로 다수의 정보를 넣을 수 있다.
- iss : 토큰 발급자
- sub : 토큰 제목
- aud : 토큰 대상자
- exp : 토큰 만료 시간
- nbf : 토큰 활성 날짜
- iat : 토큰 발급 시간
- jti : JWT 토큰 식별자 (JWT ID), 중복 방지를 위해 사용하며, 일회용 토큰(Access Toekn)등에 사용
서명(Sginature)
- 서명은 토큰을 인코딩 하거나 유효성을 검증 할때 사용하는 고유한 암호화 코드이다.
- 헤더와 페이로드의 값을 각각 Base64로 인코딩하고, 인코딩한 값을 비밀키를 이용해 헤더에서 정의한 알고리즘으로 해싱을하고, 이 값을 다시 Base64로 인코딩해서 생성한다.
- 생성된 토큰은 다음과 같이 HTTP 통신을 할때 Authorization 이라는 key의 value 로 사용된다.
\{ "Authorization" : "Bearer {생성된 토큰 값}", }
JWT Process
- 사용자가 id와 password를 통해 로그인을 시도
- 서버는 요청을 확인하고, 시크릿 키를 통해 액세스 토큰을 생성후 클라이언트에게 전달
- 클라이언트는 토큰을 브라우저에 저장, 이후 API 요청을 할때 Header 에 Access tokken을 담아서 서버로 보낸다.
- 서버는 토큰의 유효성을 검사하고 유저의 정보와 권환을 확인 후 서비스를 제공
주의점
- 페이로드 자체는 암호화 된것이 아니여서 중간자 어택으로 payload 를 탈취해 인코딩하면 데이터를 볼수 있기 때문에 토큰에는 중요 데이터는 넣지 않아야 한다.
- JWT는 한먼 만들어지면 제어가 불가능하다. 토큰을 임의로 삭제할 수가 없으니 꼭 만료 시간을 넣어줘야 한다.
- 정보가 많아 질수록 토큰의 길이가 늘어나서 네트워크에 부하를 줄 수 있다.