이전 포스트에서는 인증과 인가의 기본 개념과 세션과 JWT기반 인증에 관해 작성했습니다.
이번 포스트에서는 JWT 저장위치에 대해서 설명합니다.
JWT(JSON Web Token)를 사용하면 클라이언트가 서버에 요청을 보낼 때마다 서버로 토큰을 보내서 사용자를 인증할 수 있습니다. 그러나 이 토큰을 어디에 저장해야 할까요? 이번 포스트에서는 쿠키, 로컬 스토리지, 세션 스토리지의 차이점과 각각의 장단점, 그리고 공격 유형에 대해 알아보겠습니다.
정보보안산업기사, 정보보안기사 단골 문제!
CSRF는 웹 사이트의 취약점을 이용하여 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행동을 하도록 만드는 공격입니다.
예를 들어, 사용자가 로그인 상태로 어떤 웹사이트를 방문하고 있다고 가정합시다. 그런데 이 사용자가 악성 코드가 삽입된 다른 웹사이트를 방문하게 되면, 그 사이트는 사용자의 이름으로 위조된 요청을 보낼 수 있습니다. 서버 입장에서는 정상적인 요청으로 보일 것입니다.
XSS 공격은 해커가 웹 페이지에 악성 스크립트를 삽입하는 공격입니다. 사용자가 해당 페이지를 열람할 때 스크립트가 실행되어 개인 정보 등을 탈취당할 수 있습니다.
예를 들어, 게시판 같은 곳에 JavaScript 코드 조각을 포함한 글을 작성한다면, 다른 사용자들이 그 글을 열람하는 순간 코드 조각이 실행됩니다.
쿠키는 클라이언트와 서버 간에 상태 정보를 주고받기 위한 작은 데이터 조각입니다. 웹 브라우저는 쿠키를 저장하고, 각 요청 시 서버로 전송합니다.
위에서 설명한 것 처럼 쿠키는 작은 데이터 조각이기 때문에 크기 제한이 있습니다.
클라이언트에 300개까지 쿠키저장 가능, 하나의 도메인당 20개의 값만 가질 수 있으며, 하나의 쿠키값은 4KB까지 저장이 가능합니다.
HTML5 Web Storage API의 일부인 Local Storage는 웹 페이지가 사용자의 브라우저에 데이터를 저장하는 방법 중 하나입니다.
세션 스토리지 역시 HTML5 Web Storage API의 일부로, 로컬 스토리지와 매우 유사합니다. 그러나 세션 스토리지는 페이지 세션이 끝나면(즉, 탭을 닫으면) 데이터가 사라집니다.
JWT를 어디에 저장할 것인가는 애플리케이션의 보안 요구사항과 개발 편의성 등 여러 요소를 고려하여 결정해야 합니다. 보안을 최우선으로 생각한다면 쿠키에 저장하는 것이 좋으며, 개발 편의성과 용량을 중요하게 생각한다면 웹 스토리지(로컬 또는 세션)를 선택할 수 있습니다. 각 선택에 따른 위험성을 이해하고 이를 최소화하는 방법을 찾아야 합니다.