JWT 저장 위치: 쿠키 vs 로컬 스토리지 vs 세션 스토리지

이호영·2023년 9월 4일
0

JWT

목록 보기
2/5

이전 포스트

이전 포스트에서는 인증과 인가의 기본 개념과 세션과 JWT기반 인증에 관해 작성했습니다.
이번 포스트에서는 JWT 저장위치에 대해서 설명합니다.

요약 정리

JWT(JSON Web Token)를 사용하면 클라이언트가 서버에 요청을 보낼 때마다 서버로 토큰을 보내서 사용자를 인증할 수 있습니다. 그러나 이 토큰을 어디에 저장해야 할까요? 이번 포스트에서는 쿠키, 로컬 스토리지, 세션 스토리지의 차이점과 각각의 장단점, 그리고 공격 유형에 대해 알아보겠습니다.

CSRF, CSS(XSS)

정보보안산업기사, 정보보안기사 단골 문제!

CSRF (Cross-Site Request Forgery)

CSRF는 웹 사이트의 취약점을 이용하여 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행동을 하도록 만드는 공격입니다.

예를 들어, 사용자가 로그인 상태로 어떤 웹사이트를 방문하고 있다고 가정합시다. 그런데 이 사용자가 악성 코드가 삽입된 다른 웹사이트를 방문하게 되면, 그 사이트는 사용자의 이름으로 위조된 요청을 보낼 수 있습니다. 서버 입장에서는 정상적인 요청으로 보일 것입니다.

방어

  • SameSite 쿠키 속성: 이 속성을 설정하면 브라우저가 다른 도메인의 요청에 대해 쿠키를 전송하지 않습니다.
  • CSRF 토큰: 서버에서 임의로 생성한 값을 폼에 함께 전달하여, 클라이언트가 폼 제출 시 해당 값을 함께 전송합니다. 서버는 이 값을 확인하여 정상적인 요청인지 판단합니다.

XSS (Cross-Site Scripting)

XSS 공격은 해커가 웹 페이지에 악성 스크립트를 삽입하는 공격입니다. 사용자가 해당 페이지를 열람할 때 스크립트가 실행되어 개인 정보 등을 탈취당할 수 있습니다.

예를 들어, 게시판 같은 곳에 JavaScript 코드 조각을 포함한 글을 작성한다면, 다른 사용자들이 그 글을 열람하는 순간 코드 조각이 실행됩니다.

방어

  • 입력값 검증 및 인코딩: 사용자로부터 받은 입력값에 대해 HTML 태그 등 필요 없는 문자열은 제거하거나 인코딩합니다.
  • CSP (Content Security Policy): CSP를 설정하면 특정 소스에서 로드된 스크립트만 실행하도록 브라우저에 지시할 수 있습니다.

쿠키 (Cookies)

쿠키는 클라이언트와 서버 간에 상태 정보를 주고받기 위한 작은 데이터 조각입니다. 웹 브라우저는 쿠키를 저장하고, 각 요청 시 서버로 전송합니다.
위에서 설명한 것 처럼 쿠키는 작은 데이터 조각이기 때문에 크기 제한이 있습니다.
클라이언트에 300개까지 쿠키저장 가능, 하나의 도메인당 20개의 값만 가질 수 있으며, 하나의 쿠키값은 4KB까지 저장이 가능합니다.

장점

  • HttpOnly 옵션: JavaScript에서 접근할 수 없으므로 XSS(Cross-Site Scripting) 공격으로부터 안전합니다.
  • Secure Flag 옵션: HTTPS 연결을 통해서만 쿠키가 전송되므로 중간자 공격(MITM)으로부터 보호받습니다.
  • SameSite 옵션: CSRF(Cross-Site Request Forgery) 공격 방어 가능

단점

  • CSRF 공격 위험성: SameSite 설정이 없거나 잘못 설정된 경우 CSRF 공격에 노출됩니다.
  • 크기 제한: 총 4KB 크기 제한이 있어 많은 정보를 저장하기 어려울 수 있습니다.

로컬 스토리지 (Local Storage)

HTML5 Web Storage API의 일부인 Local Storage는 웹 페이지가 사용자의 브라우저에 데이터를 저장하는 방법 중 하나입니다.

장점

  • 용량: 5MB 이상의 데이터를 저장할 수 있어 JWT 같은 비교적 큰 데이터도 충분히 담을 수 있습니다.
  • 사용 편의성: JavaScript API가 제공되므로 다루기 용이합니다.

단점

  • XSS 공격 위험성: JavaScript에서 접근 가능하므로 XSS 공격으로부터 안전하지 않습니다.
  • Permanence : 만료 기간이 없어 수동으로 제거하지 않는 한 데이터가 영구적으로 남습니다.

세션 스토리지 (Session Storage)

세션 스토리지 역시 HTML5 Web Storage API의 일부로, 로컬 스토리지와 매우 유사합니다. 그러나 세션 스토리지는 페이지 세션이 끝나면(즉, 탭을 닫으면) 데이터가 사라집니다.

장점

  • 용량: 로컬 스토리지와 같이 5MB 이상의 데이터를 저장할 수 있습니다.
  • 사용 편의성: JavaScript API를 통해 쉽게 사용할 수 있습니다.

단점

  • XSS 공격 위험성: 로컬 스토리지와 마찬가지로 XSS 공격에 취약합니다.
  • Lifespan : 탭이 닫히면 정보가 사라져서 지속적인 인증 정보 유지에 제한이 있습니다.

결론

JWT를 어디에 저장할 것인가는 애플리케이션의 보안 요구사항과 개발 편의성 등 여러 요소를 고려하여 결정해야 합니다. 보안을 최우선으로 생각한다면 쿠키에 저장하는 것이 좋으며, 개발 편의성과 용량을 중요하게 생각한다면 웹 스토리지(로컬 또는 세션)를 선택할 수 있습니다. 각 선택에 따른 위험성을 이해하고 이를 최소화하는 방법을 찾아야 합니다.

0개의 댓글