JWT 이란?
JWT(JSON WEB TOCKEN)은 전자 서명 된 URL-Safe(url로 이용할 수 있는 문자만 구성된)의 JSON 입니다.
전자 서명은 JSON 의 변조를 체크 할 수 있게되어 있습니다.
JWT는 속성 정보(Claim)를 JSON 데이터 구조로 표현한 토큰으로 RFC7519 표준입니다.
JWT는 서버와 클라이언트 간 정보를 주고 받을 때 HTTP Request Header 에 JSON 토큰을 넣은 후 서버는 별도의 인증 과정 없이 헤더에 포함되어 있는 JWT 정보를 통해 인증합니다.
세션의 문제점
세션을 메모리에 저장하게 된다면 성능의 무리가 가고 연결로 데이터 베이스에서 문제가 감
또 서버 확장이 어려움 -> 더 많은 트래픽을 감당하기 위해 로드 밸랜성을 하게 된다면 다른 분산된 프로세스에서 동기화가 된 세션을 유지 하게 하는 작업이 필요함
토큰 시스템
서버 시스템 측에서 유저의 정보를 유지하지 않고(메모리 가용성 높아짐)
유저가 인증을 할때 토큰을 발급함으로써 토큰을 통한 전체 인증이 가능해집니다.
토큰의 내부는 유효기간, 정보등을 해싱 알고리즘으로 인증이 되어있어 서버에서 검증을 통해 정보가 변조되지 않음을 보장해주는게 가능
또 서버를 확장하고 플랫폼 간의 권한을 공유 할 수 있습니다.
다른 프로세스 라도 같은 토큰으로 서버에 요청하게 되므로 서버에서는 위조되었는지만 확인하면 됨, 그리고 플랫폼은 해당 사용자가 다른 플랫폼에서 로그인을 하고 토큰을 발급해주면 서버에서 그 정보를 가져오고 서비스에 계성 생성이 가능해집니다.
또 모바일 어플리케이션에서도 세션을 사용한다면 쿠키를 사용해서 쿠키매니저를 관리해줘야하지만 토큰으리마녀 웹 요청 api에 헤더를 넣어서 사용해주면 가능
토큰 저장 위치
첫 번째
두가지 방법 중 첫번째 서버가 토큰을 응답정보에 넣어서 전달하고 해당 값을 웹 스토리지(localStorage , sessionStorage)에 넣고 요청마다 HTTP 헤더 값에 넣어서 요청하는 방법
->이 방법은 쉽고 하나의 도메인에 제한되지 않는다라는 장점이 있지만 해커의 XSS(Cross Site Scripting)공격에 매우 쉽게 토큰을 탈취 될수 있습니다.
두 번째
두번째 방법은 토큰을 쿠키에 넣는 방법 입니다. 쿠키를 사용한다고해서 세션을 관리하는게 아니라 쿠키를 정보 전송 수단으로 사용합니다. 이 과정에서 서버측에 응답을 할때 쿠키를 설정 해 줄때 httpOnly의 값을 활성해 해주면 네트워크 상에서만 해당 쿠키가 더해지게 됩니다. 따라서 브라우저 상에서는 자바스크립트로 토큰값에 접근하는것이 불가능해집니다.
또 여러 도메인에서 사용가능하던 토큰이 쿠키에 넣어서 움직이므로 한정된 도메인에서만 사용이 된다는 점입니다. 이 부분을 현재 사이트 토큰을 이용해서 새 토큰을 문자열로 받아오는 API 개발 필요
또 다른 단점은 XSS의 위협에서 해방되는 대신 CSRF 공격의 위험성이 생깁니다. CSRF는 계정의 정보를 탈취하는 것은 아니지만 스크립트를 이용해서 의도한 스크립트가 아닌 다른 작업이 수행되게 하는 것입니다.
해결방안은 CSRF의 경우 HTTP 요청 레퍼런스 체크 CSRF 토큰의 사용을 통하여 방지할 수있습니다.
Secure & HttpOnly
Secure의 경우 https의 http 통신의 경우에만 쿠키를 전송합니다.
HttpOnly는 js의 document.cookie를 이용해서 쿠키에 접속을 막는 옵션입니다.