Hama Develop

Daily Study Logging34 - JWT 토큰 저장위치 에 대하여

June 19, 2020

JWT 는 Json Web Token의 약자다.

JSON 형식으로 되어있는 토큰으로 사용자가 서버에 자원을 요청할 때 함께 전달하여 해당 자원을 요청할 자격이 있음을 증명한다.

클라이언트에서 서버로 토큰이 전달되어야 하는데, 그러기 위해서는 토큰을 어딘가 에서는 저장하고 있어야 한다.

토큰을 저장하는 방식은 일반적으로 두가지로 나뉜다. 웹 스토리지와, 쿠키다.

  1. 웹 스토리지

html5 부터 클라이언트에 데이터를 저장할 수 있게 되었다. 웹 스토리지에는 5MB까지 정보를 저장할 수 있어 쿠키의 4KB 보다 훨씬 많은 정보를 담을 수 있다.

웹 스토리지는 로컬 스토리지와 세션 스토리지로 나뉘어 지는데, 로컬 스토리지는 창이 꺼져도 데이터가 유지가 되고 세션 스토리지는 창이꺼지면 데이터가 지워진다.

웹스토리지를 JWT 저장을 위해 사용한다면, 여기에 토큰을 저장해 놓고 HTTP요청을 할때 함께 보내진다. 주로 Authorization 헤더에 Bearer 스키마를 사용해서 보낸다.

웹 스토리지는 자바스크립트로 제어 가능하다. 즉 XSS공격에 대한 위험이 있다는 말이다. 해커가 자바스크립트 코드를 웹페이지에 심어 해당 코드로 사용자의 정보를 탈취하는 일이 가능하다는 말이다.

해커가 클랑언트의 ID를 획득하여 정상 사용자로 가장하는 등의 공격이 가능하다.

XSS 취약점을 근본적으로 제거하기 위해서는 스크립트 등 해킹에 사용될 수 있는 코딩에 사용되는 입력 및 출력 값에 대해서 검증하고 무효화시켜야 한다.

  1. 쿠키 쿠키 역시 브라우져가 토큰을 기억하다 서버에 전달해 준다는 측면에서 웹 스토리지와 같다.

하지만, 쿠키는 옵션 설정을 하면 자바스크립트 조작을 막을 수있다는 차이가 있다. Http Only옵션을 주면 쿠키는 자바스크립트로 접근이 불가능하다. 오로지 HTTP 통신을 통해서만 쿠키가 전송된다. 따라서 웹 스토리지에서 발생할 수 있었던 XSS 공격을 막을 수 있다. Secure 옵션을 주면 HTTPS 로만 쿠키가 전송되기에 더 높은 보안수준을 만들 수 있다.

대신 쿠키는 CSRF 공격에 당할 수 있다는 위험성이 있지만, 이문제는 API에 대한 HTTP 요청을 특정함수를 통해서만 이루어지게 하는 방식으로 막을 수 있다. 그리고 HTTP 헤더에 Refer와 Origin 값을 통해서 엉뚱한 곳에서 오는 요청을 거부할 수도 있다.