JWT (JSON WEB TOKEN)
Last updated
Last updated
HTTP는 2가지 특징이 존재한다. 무상태성(Stateless), 비연결성(Connectionless)
무상태성(Stateless)
HTTP는 상태 정보를 저장하지 않는다. 이말은 즉, 누구의 요청인지 구분을 할 수 없다는 의미다. 따라서 요청 정보를 특정하기 위해서 Cookie, Session, Token 인증을 통해 클라이언트를 파악할 수 있다.
비연결성(Connectionless)
클라이언트와 서버간의 요청과 응답이 끝난뒤 연결을 끊어버리는 성질이다. HTTP는 인터넷 상에서 불특정 다수의 통신환경을 기반으로 설계되었기 때문에, 서버가 다수의 클라이언트와 연결을 계속 유지해야 한다면, 많은 리소스 점유등의 오버헤드가 발생한다.
HTTP의 이러한 특징으로 인해 아래의 방법으로 클라이언트 인증을 수행할 수 있다.
서버가 클라이언트 인증을 확인하는 방식으로 Cookie, Session, Token 방식이 있다.
만료기간이 있는 key-value 형태의 저장소
보안에 취약하다. 민감한 정보를 쿠키에 저장할 경우 그대로 노출
4kb의 용량제한
브라우저 마다 쿠키 지원 형태가 달라 브라우저간 공유가 불가능
민감한 정보를 브라우저가 아닌 서버에서 저장하고 관리함
세션 객체는 Session ID를 key로 갖는 key-value로 구성
value에 세선 생성 시간, 마지막 접근 시간, 기타 정보들이 Map형태로 저장됨
쿠키에 저장된 세션 ID 자체는 유의미한 개인정보를 담고있지 않지만 제3자가 이를 탈취하여 인증된 유저인척 위장할 수 있다.
서버 리소스를 사용하므로 트래픽 증가시 서버 부하가 발생한다.
유저 정보를 담고있는 토큰 인증 방식
토큰은 요청 헤더의 Authorization 필드에 담아 전송한다.
Authorization: {type} {credentials}
포멧으로 구성된다.
Bearer 타입을 갖는 JWT 이외에도 여러가지 토큰이 존재하는데 각 토큰별 타입이 존재한다.
토큰을 발급받은 이후 매 요청마다 헤더에 토큰이 포함되어 전송된다.
토큰의 용량이 클 경우 네트워크 통신 오버헤드가 발생할 수 있다.
토큰의 Payload는 암호화되지 않으므로 민감한 정보를 담을 수 없다.
제3자가 토큰을 탈취했을 경우 대처가 어렵다. (Expires, Refresh Token을 이용해 예방)
세션기반 인증
사용자 인증 정보를 서버측 세션 저장소(메모리, 데이터베이스 등)에 저장 및 관리한다.
서버 자원을 사용하므로 요청량 증가시 서버 부하가 증가한다.
토큰기반 인증
서버로 부터 발급된 유저 정보가 담긴 토큰을 브라우저에 저장 및 관리한다.
브라우저에 저장되므로 서버 자원을 아낄 수 있지만 토큰의 용량이 클 경우 네트워크 통신 오버헤드 발생
JWT는 요청에 필요한 정보를 암호화시킨 JSON 토큰을 의미한다. JWT는 토큰 기반 인증으로 HTTP 헤더에 담아 서버가 클라이언트를 식별하는 방법이다.JWT는 JSON 데이터를 base64 URL-safe Encode를 통해 인코딩하며, 토큰 내부에는 위변조 방지를 위해 개인키(secret key)를 통한 전자서명이 포함되어있다. 따라서 토큰을 전달받은 서버는 검증(verify)을 통해 완료되면 응답을 전송한다.
JWT는 .
구분자로 나누어지는 세가지 문자열의 조합이다. 각각 왼쪽에서부터 Header, Payload, Signature
를 의미한다.
typ: 토큰 유형
alg: 해시 알고리즘
토큰에서 사용할 정보 Claim으로 구성되어 있다.
시스템에서 실제로 사용될 정보를 담는다.
헤더, 페이로드를 base64 url방식 인코딩한 후 Hedaer에 명시한 해시 알고리즘을 적용하고 secret key로 서명한 전자서명이 담겨있다.