JWT(jsonwebtoken) 토큰 저장 위치


웹 서비스를 만들때 제일 기본적으로 구현해야하는 부분중의 하나가 인증이라고 생각한다.

처음에 아무것도 모를때는 localStorage나 sessionStorage와 같은 브라우저 저장소를 사용했다.

위와 같은 브라우저 저장소를 사용하면 장점도 있지만 단점으로 보안적인 문제가 있다.

위 두가지와 cookie 관련해서도 블로그에 적어둔 글이 있어서 링크를 남긴다.

브라우저 저장소는 자바스크립트로 값을 쉽게 저장하고 가져와서 사용할 수 있기 때문에 편리하지만 이렇게 자바스크립트로 제어가 가능하다는것은 곧 XSS(cross-site scripting) 공격에 취약할 수 있음을 의미한다.

XSS를 간략하게 설명하면 해커가 자바스크립트 코드를 웹페이지에 심어두어 사용자의 정보를 탈취하는 종류의 공격이다. 

웹에서 사용자로부터 많은 데이터들을 입력받게 되는데 이때 해커가 작성해둔 자바스크립트 코드로 해커가 원하는것을 얻을 수 있게 된다.

많이 알려진 공격 방식이라서 필터링 하는방법이 있다고 한다. 그럼에도 불구하고 다양한 우회방법이 존재할 수 있기 때문에 완벽하게 방어하기란 쉽지 않다고 한다.


localStorage와 sessionStorage 이외에도 cookie(쿠키)가 있다. 

앞에서의 두가지 브라우저 저장소와 달리 cookie는 조금 더 보안적으로 안전하다.

XSS 공격을 방어할 수 있는 HttpOnly 옵션을 작성해주면 되기때문이다. 하지만 이방식에서도 CSRF(cross-site request forgery)라는 또 다른 공격에 취약할 수 있다.


cookie의 작동 방식을 간략히 설명하면 사용자 인증을 하게 될 때 서버측에서는 헤더를 통해서 토큰을 보낸다. 브라우저는 이를 통해서 쿠키를 생성하고 토큰을 저장한다. 

이후에 api 요청을 하게 될 때 브라우저가 자동으로 해당 쿠키를 같이 보낸다. 따로 쿠키를 서버에 직접 전달하지 않아도 자동으로 전달해준다.

그런데 이러한 방식에서 보안적인 문제점이 발생할 수 있다.

www.example.com 에서 생성한 쿠키를 www.test.com에서 사용할 수 없다. 당연한 이야기이다. 그런데 여기서 www.example.com으로 HTTP 요청을 하면 브라우저는 알아서 쿠키를 헤더에 담아서 보내게 된다.

HttpOnly 옵션을 준 경우 쿠키 정보를 자바스크립트를 통해서는 얻을 수 없지만 HTTP 헤더를 통해서 정보에대한 탈취가 발생할 수 있다.

쿠키는 전송할 때 목적지의 도메인에 따라서 포함여부가 결정되는것이지 출발지가 어디냐는 신경쓰지 않는다는 문제점이 있다.

그렇다면 모든것이 위험한데 어디에 저장해야 되는것일까??

그나마 저장을 한다면 Cookie를 사용하는 것이다. Cookie 에는 이를 방어할 수 있는 방법들이 있다. api에 대한 http 요청을 특정 함수나 문자를 통해서만 이루어지도록 하는것이다. 그래서 이를 통한 요청이 아닌 경우 인증을 거부하도록 하는것이다.

그 외에도 HTTP 헤더를 분석해서 막는 방법도있고 HTTP 헤더에 있는 Referer와 Origin 값을 통해서 알 수 없는 곳에서 요청이 오면 이를 거부하도록 할 수 있다.

그래서 내가 생각하기에 조금 더 쉽게 다양한 공격을 안전하게 방어할 수 있는 방법은 Cookie에 저장하는 것이라고 생각한다.





댓글