문서의 각 단락이 어느 리비전에서 마지막으로 수정되었는지 확인할 수 있습니다. 왼쪽의 정보 칩을 통해 작성자와 수정 시점을 파악하세요.

Local Storage | |
정의 | 웹 브라우저에 데이터를 키-값 쌍으로 저장하는 웹 스토리지 API |
유형 | 웹 스토리지(Web Storage) |
최초 등장 | HTML5 |
주요 용도 | 사용자 설정, 폼 데이터 자동 저장, 오프라인 데이터 캐싱 등 클라이언트 측 데이터 지속성 관리 |
관련 분야 | 프론트엔드 개발 웹 개발 JavaScript |
상세 정보 | |
특징 | 세션 스토리지(sessionStorage)와 달리 브라우저를 닫아도 데이터가 유지됨 도메인별로 독립적이며, 다른 도메인에서 접근 불가 동기적으로 동작 약 5MB[1]의 저장 공간을 일반적으로 제공 |
저장 형식 | 문자열만 저장 가능. 객체 등 복잡한 데이터는 JSON.stringify()를 사용해 문자열로 변환하여 저장 |
주요 메서드 | setItem(key, value): 데이터 저장 getItem(key): 데이터 조회 removeItem(key): 특정 데이터 삭제 clear(): 모든 데이터 삭제 |
장점 | 쿠키보다 간단한 API 쿠키보다 큰 저장 용량 네트워크 요청에 데이터가 포함되지 않아 성능상 이점 |
단점 | 보안에 민감한 정보 저장에 부적합(클라이언트 측에 평문 저장) 동기적 동작으로 대용량 데이터 처리 시 메인 스레드 차단 가능성 |
대안 기술 | IndexedDB(더 큰 용량, 비동기, 구조화된 데이터) 쿠키(Cookie) 서버 측 데이터베이스 |

로컬 스토리지는 웹 브라우저에 데이터를 키-값 쌍으로 저장하는 웹 스토리지 API이다. HTML5 표준의 일부로 최초 등장했으며, 클라이언트 측에서 데이터의 지속성을 관리하는 데 주로 사용된다.
이 기술의 주요 용도는 사용자 설정 저장, 폼 데이터 자동 저장, 그리고 오프라인 상태에서도 접근 가능한 데이터 캐싱 등이 있다. 이를 통해 웹 애플리케이션은 서버에 의존하지 않고도 사용자의 로컬 환경에 정보를 보존할 수 있어, 사용자 경험을 개선하고 네트워크 요청을 줄이는 데 기여한다.
로컬 스토리지는 프론트엔드 개발과 웹 개발 분야에서 자바스크립트를 통해 광범위하게 활용되는 핵심 기술 중 하나이다. 세션 스토리지와 함께 웹 스토리지를 구성하는 두 가지 주요 메커니즘으로, 데이터의 수명 주기와 접근 범위에서 차이를 보인다.

로컬 스토리지의 저장 용량은 웹 애플리케이션이 클라이언트 측에 데이터를 얼마나 많이 보관할 수 있는지를 결정하는 핵심 요소이다. 대부분의 현대 웹 브라우저는 도메인당 약 5MB에서 10MB의 저장 공간을 제공한다. 이 용량은 쿠키에 비해 훨씬 크며, 사용자 환경 설정이나 폼 데이터와 같은 상대적으로 작은 규모의 데이터를 저장하는 데 적합하다.
용량 제한은 브라우저와 운영체제, 심지어 사용자의 브라우저 설정에 따라 달라질 수 있다. 일부 브라우저는 사용자가 이 제한을 늘리거나 줄일 수 있는 옵션을 제공하기도 한다. 개발자는 localStorage 객체의 setItem 메서드를 사용해 데이터를 저장하며, 저장 공간이 가득 차면 QUOTA_EXCEEDED_ERR 예외가 발생한다. 따라서 중요한 데이터를 저장하기 전에 사용 가능한 공간을 확인하거나, try...catch 문을 활용하여 오류를 처리하는 것이 좋다.
이 5-10MB의 제한은 텍스트 기반의 키-값 쌍을 저장하는 데는 충분하지만, 대용량 이미지나 오디오 파일과 같은 바이너리 데이터를 직접 저장하기에는 부족할 수 있다. 이러한 대용량 데이터를 다루어야 하는 웹 애플리케이션의 경우, IndexedDB와 같은 더 강력한 클라이언트 측 저장소를 고려하는 것이 일반적이다.
Local Storage는 데이터를 저장할 때 키(key)와 값(value)의 쌍(pair) 형태를 사용한다. 이때 키와 값 모두 반드시 문자열 형식이어야 한다는 점이 가장 중요한 기술적 특징이다. 이는 JavaScript 객체나 배열과 같은 복잡한 데이터 구조를 직접 저장할 수 없음을 의미한다.
따라서 객체나 배열과 같은 데이터를 저장하려면 JSON 형식으로 변환하는 과정이 필요하다. JSON.stringify() 메서드를 사용해 객체를 문자열로 직렬화(serialize)하여 저장하고, 데이터를 읽어올 때는 JSON.parse() 메서드를 통해 다시 원래의 자료구조로 변환하여 사용한다. 이 방식을 통해 사용자 설정 정보나 간단한 애플리케이션 상태를 효율적으로 관리할 수 있다.
이 문자열 기반의 제한은 Local Storage의 설계 상 단순함과 호환성을 우선시한 결과이다. 이로 인해 데이터 타입에 대한 별도의 관리가 필요 없고, API 사용법이 직관적이라는 장점이 있다. 그러나 숫자나 불리언(boolean) 값도 저장 시 자동으로 문자열로 변환되므로, 값을 꺼내서 사용할 때는 필요에 따라 명시적인 형 변환을 해주어야 한다.
로컬 스토리지의 데이터는 도메인과 프로토콜 및 포트에 의해 엄격하게 격리된다. 이는 동일 출처 정책과 유사한 원리로, 서로 다른 출처의 웹 페이지는 서로의 로컬 스토리지 데이터에 접근하거나 수정할 수 없다. 예를 들어, https://example.com에서 저장한 데이터는 https://othersite.com이나 http://example.com에서 접근이 불가능하다.
이러한 도메인 제한은 보안 측면에서 중요한 의미를 가진다. 악의적인 스크립트가 임의의 사이트의 데이터를 읽거나 쓰는 것을 방지하여, 사용자의 민감한 정보가 노출되는 것을 막는다. 따라서 각 웹사이트는 자신의 도메인 아래에 생성된 고유한 저장 공간을 독립적으로 관리하게 된다.
개발자는 이 제한을 활용하여 특정 도메인에 종속된 사용자 환경 설정, 로그인 상태 토큰, 또는 애플리케이션의 임시 데이터를 안전하게 저장할 수 있다. 반면, 여러 서브도메인 간에 데이터를 공유해야 하는 경우에는 추가적인 설정이 필요하다.

Local Storage는 음악 서비스와 같은 웹 애플리케이션에서 사용자의 환경 설정을 지속적으로 저장하는 데 널리 활용된다. 서비스를 이용하는 동안 사용자가 설정한 테마(밝은 모드/어두운 모드), 음질 옵션, 자동 재생 여부, 알림 설정 등의 선호도는 키-값 쌍 형태로 사용자의 웹 브라우저에 저장된다. 이는 사용자가 동일한 도메인에서 서비스를 재방문할 때마다 매번 설정을 다시 조정하지 않아도 되도록 하여 편의성을 크게 향상시킨다.
이러한 설정 정보는 일반적으로 JSON 형식으로 직렬화되어 저장된다. 예를 들어, 사용자가 선호하는 재생 반복 모드(한 곡 반복, 전체 반복, 끄기)나 볼륨 크기와 같은 세부적인 값 하나하나가 객체 형태로 묶여 하나의 키에 저장될 수 있다. 프론트엔드 개발자는 JavaScript를 통해 이러한 데이터를 Local Storage에 쓰거나 읽어와 애플리케이션의 초기 상태를 사용자 맞춤형으로 복원한다. 이는 서버에 지속적으로 요청을 보낼 필요가 없어 네트워크 트래픽을 줄이고 애플리케이션의 반응 속도를 높이는 데도 기여한다.
음악 서비스에서 Local Storage는 사용자가 생성하거나 수정 중인 재생 목록을 임시로 보관하는 데 활용된다. 서버와의 통신 없이도 브라우저 내에서 빠르게 데이터를 읽고 쓸 수 있어, 재생 목록 추가나 순서 변경과 같은 작업을 실시간으로 반영하는 데 유용하다. 이는 네트워크 지연 시간을 최소화하고 사용자 경험을 매끄럽게 만든다.
특히, 사용자가 재생 목록을 편집하는 도중에 페이지를 새로 고치거나 실수로 탭을 닫는 경우, Local Storage에 임시 저장된 데이터를 복구하여 작업 내용이 유실되는 것을 방지할 수 있다. 이는 사용자 경험을 크게 향상시키는 기능이다. 최종적으로 재생 목록 편집이 완료되면, 애플리케이션은 Local Storage에 임시 저장된 데이터를 서버에 전송하여 영구적으로 저장한다.
이러한 임시 저장 메커니즘은 오프라인 환경에서도 제한적으로 활용될 수 있다. 예를 들어, 네트워크에 연결되지 않은 상태에서도 사용자는 기존에 캐시된 인터페이스를 통해 로컬에 저장된 재생 목록 데이터를 확인할 수 있으며, 새로운 목록을 임시로 구성해 둘 수 있다. 이후 온라인 상태가 되면 이 변경 사항이 서버와 동기화된다.
따라서 Local Storage는 음악 서비스의 재생 목록 관리에서 데이터의 일시적 지속성을 제공하는 핵심 도구로 작동하며, 프론트엔드 개발에서 클라이언트 측 상태 관리를 효율적으로 구현하는 데 기여한다.
일부 음악 스트리밍 서비스는 오프라인 환경에서도 제한적으로 콘텐츠를 재생할 수 있는 기능을 제공한다. 이때 Local Storage는 사용자가 미리 캐시해 둔 오디오 데이터의 메타정보나 재생 상태를 관리하는 데 활용된다. 예를 들어, 사용자가 특정 재생 목록을 오프라인에서 들을 수 있도록 다운로드하면, 각 트랙의 식별자, 재생 위치, 다운로드 완료 여부 등의 정보가 Local Storage에 저장될 수 있다.
이는 실제 대용량의 오디오 파일 자체를 저장하는 공간이 아니며, 주로 인덱싱과 상태 추적을 위한 경량 데이터를 다룬다. 서비스에 재접속하면 이 저장된 정보를 바탕으로 오프라인 시 청취한 기록을 동기화하거나, 중단했던 지점부터 재생을 이어나가는 등의 사용자 경험을 제공한다. 따라서 Local Storage는 완전한 오프라인 재생을 가능하게 하는 핵심 저장 매체라기보다, 오프라인 모드를 지원하는 애플리케이션의 상태 관리 및 메타데이터 저장을 돕는 보조 수단의 역할을 한다.

Local Storage는 웹 개발에서 클라이언트 측 데이터를 관리하는 데 있어 몇 가지 뚜렷한 장점을 제공한다. 가장 큰 장점은 데이터의 영속성이다. 쿠키와 달리 Local Storage에 저장된 데이터는 브라우저 세션이 종료되거나 컴퓨터가 재시작되어도 삭제되지 않는다. 이는 사용자의 환경 설정이나 폼 입력 데이터와 같이 장기간 유지해야 하는 정보를 저장하는 데 매우 적합하다.
또한, 용량 제한이 쿠키에 비해 훨씬 크다는 점이 장점이다. 대부분의 현대 웹 브라우저는 도메인당 약 5MB에서 10MB 정도의 저장 공간을 제공하며, 이는 쿠키의 4KB 제한에 비해 상당히 넓은 공간이다. 이로 인해 더 많은 양의 데이터, 예를 들어 사용자의 대규모 설정 정보나 간단한 애플리케이션 데이터를 저장할 수 있다.
사용의 편의성도 중요한 장점 중 하나이다. JavaScript를 통해 localStorage.setItem()과 localStorage.getItem() 같은 간단한 메서드로 데이터를 쉽게 저장하고 조회할 수 있다. 복잡한 서버 측 설정이나 데이터베이스 연결 없이도 프론트엔드 개발에서 독립적으로 데이터 지속성을 구현할 수 있어 개발 효율성을 높인다.
마지막으로, 서버에 대한 요청을 줄일 수 있다는 점이 있다. 자주 사용되지만 자주 변경되지 않는 정적 데이터나 사용자별 설정을 Local Storage에 캐싱해 두면, 매번 서버에서 동일한 데이터를 요청할 필요가 없어진다. 이는 네트워크 트래픽을 절약하고 애플리케이션의 응답 속도를 개선하는 데 기여한다.
local storage는 편리한 클라이언트 측 저장소이지만 몇 가지 명확한 한계점을 가진다. 가장 큰 단점은 저장 용량의 제한이다. 대부분의 현대 웹 브라우저는 도메인당 약 5MB에서 10MB 정도의 저장 공간만을 할당하며, 이는 이미지나 긴 오디오 파일과 같은 대용량 데이터를 저장하기에는 부족하다. 또한, 저장된 데이터는 모두 문자열 형식으로만 처리되므로, 객체나 배열과 같은 복잡한 자료구조를 저장하려면 JSON 형식으로 변환하는 추가 작업이 필요하다.
보안 측면에서도 취약점이 존재한다. local storage에 저장된 데이터는 자바스크립트 코드를 통해 완전히 접근 가능하기 때문에, 크로스 사이트 스크립팅(XSS) 공격에 노출될 경우 중요한 사용자 정보가 유출될 수 있다. 따라서 비밀번호나 개인 식별 정보(PII)와 같은 민감한 데이터는 절대 저장해서는 안 된다. 데이터는 클라이언트 측에만 존재하며 서버와의 자동 동기화 기능이 없어, 사용자가 다른 기기나 브라우저를 사용할 경우 동일한 데이터에 접근할 수 없다는 문제도 있다.
성능 이슈도 무시할 수 없다. local storage의 모든 작업은 동기적으로 처리된다. 이는 대량의 데이터를 읽거나 쓸 때 메인 스레드를 차단하여 웹 페이지의 반응성을 떨어뜨리고, 사용자 경험을 저하시킬 수 있다. 마지막으로, 저장된 데이터에 대한 만료 기간 설정이 불가능하다는 점도 관리상의 어려움을 준다. 데이터는 사용자가 직접 삭제하거나 웹 브라우저의 설정을 초기화하지 않는 한 반영구적으로 남아 있게 된다.

Session Storage는 웹 브라우저에 데이터를 키-값 쌍으로 저장하는 웹 스토리지 API의 한 종류이다. 이 기술은 HTML5 표준의 일부로 최초 등장하였으며, 클라이언트 측에서 데이터의 지속성을 관리하기 위해 설계되었다. Local Storage와 마찬가지로 JavaScript를 통해 간편하게 접근하고 조작할 수 있어 프론트엔드 개발에서 널리 활용된다.
Session Storage의 가장 큰 특징은 데이터의 수명 주기가 브라우저 세션으로 제한된다는 점이다. 즉, 사용자가 브라우저의 특정 탭이나 창을 닫으면 해당 탭에 저장된 모든 데이터가 자동으로 삭제된다. 이는 같은 사이트라도 다른 탭에서 열린 페이지는 서로 다른 Session Storage를 가지게 됨을 의미한다. 따라서 사용자 설정이나 폼 입력 데이터를 임시로 저장하는 데 적합하다.
주요 용도로는 사용자 환경 설정 임시 저장, 장바구니 데이터 보관, 다단계 폼 작성 중 데이터 유지 등이 있다. 쿠키와 비교했을 때, 서버에 자동으로 전송되지 않아 네트워크 트래픽을 줄일 수 있고, 약 5MB 이상의 더 큰 저장 공간을 제공한다는 장점이 있다. 데이터는 동일 출처 정책에 따라 각 도메인별로 격리되어 관리된다.
Session Storage는 IndexedDB나 Local Storage와 함께 클라이언트 측 데이터 저장 솔루션을 구성한다. 단기적이고 탭 단위로 독립적인 데이터를 다루는 시나리오에 특화되어 있으며, 영구적인 데이터 저장이 필요할 때는 Local Storage나 IndexedDB를 고려하는 것이 일반적이다.
IndexedDB는 웹 브라우저에서 사용할 수 있는 클라이언트 측 데이터베이스 API이다. Local Storage가 단순한 키-값 쌍 저장에 적합하다면, IndexedDB는 구조화된 대량의 데이터를 인덱스를 통해 효율적으로 저장하고 검색할 수 있도록 설계되었다. 이는 HTML5 표준의 일부로 도입되어 복잡한 웹 애플리케이션이 오프라인에서도 작동하거나 네트워크 요청을 최소화하는 데 핵심적인 역할을 한다.
IndexedDB는 트랜잭션 기반의 객체 지향 데이터베이스로, JavaScript 객체를 직접 저장할 수 있다. 데이터는 도메인 별로 격리되어 관리되며, 비동기 방식으로 동작하여 대용량 데이터 처리 중에도 사용자 인터페이스의 반응성을 유지한다. 주요 용도로는 오프라인 캐싱, 사용자 생성 콘텐츠의 로컬 저장, 그리고 애플리케이션 상태의 지속적 관리 등이 있다.
Local Storage와 비교했을 때 IndexedDB의 가장 큰 장점은 저장 용량과 검색 기능이다. 브라우저마다 다르지만 일반적으로 Local Storage는 5~10MB 정도로 제한되는 반면, IndexedDB는 사용자의 디스크 여유 공간의 상당 부분까지 사용할 수 있다. 또한 복잡한 쿼리와 인덱싱을 지원하므로, 사용자 재생 목록이나 대규모 카탈로그 데이터를 로컬에서 관리해야 하는 음악 스트리밍 서비스나 이커머스 플랫폼에서 유용하게 활용된다.
이 기술은 Session Storage, Cookies와 함께 클라이언트 측 데이터 지속성을 위한 주요 옵션 중 하나이다. 현대의 프로그레시브 웹 앱(PWA) 개발에서는 IndexedDB를 서비스 워커와 결합하여 완전한 오프라인 경험을 제공하는 아키텍처를 구성하기도 한다.
쿠키는 웹사이트가 사용자의 브라우저에 저장하는 작은 텍스트 데이터 조각이다. 주로 사용자의 로그인 상태, 사이트 환경 설정, 장바구니 정보 등을 관리하기 위해 사용된다. 서버가 HTTP 응답 헤더에 Set-Cookie를 포함시켜 전송하면, 브라우저는 이를 저장하고 이후 같은 도메인으로 보내지는 모든 요청에 자동으로 Cookie 헤더를 포함시켜 서버로 다시 전송한다. 이 메커니즘을 통해 웹 서버는 상태를 유지하지 않는 HTTP 프로토콜 위에서도 사용자를 식별하고 상태 정보를 관리할 수 있다.
쿠키는 만료 날짜, 도메인, 경로, 보안 속성 등 다양한 속성을 가질 수 있다. Expires 또는 Max-Age 속성으로 지속성 있는 쿠키를 설정할 수 있으며, 이 속성이 없으면 세션 쿠키로 간주되어 브라우저를 닫을 때 삭제된다. Domain과 Path 속성은 쿠키가 전송되는 범위를 제한하고, Secure 속성은 HTTPS 연결에서만 쿠키를 전송하도록 하며, HttpOnly 속성은 자바스크립트를 통한 접근을 차단하여 XSS 공격으로부터 보호하는 역할을 한다.
쿠키는 로컬 스토리지나 세션 스토리지와 비교했을 때 몇 가지 뚜렷한 차이점을 보인다. 가장 큰 차이는 쿠키는 매 HTTP 요청마다 서버로 자동 전송되지만, 웹 스토리지 API는 클라이언트 측에만 데이터를 저장하고 서버로 자동 전송하지 않는다는 점이다. 또한 쿠키의 저장 용량은 일반적으로 4KB로 제한되는 반면, 로컬 스토리지는 도메인당 최소 5MB 이상의 더 큰 공간을 제공한다. 쿠키는 만료 기한을 설정할 수 있어 세션 관리에 적합하지만, 로컬 스토리지는 명시적으로 삭제하지 않는 한 영구적으로 데이터를 보관한다.
쿠키는 사용자 추적, 광고 타겟팅, A/B 테스트 등에도 널리 사용된다. 그러나 이러한 활용은 사용자의 개인정보 보호와 관련된 논란을 불러일으키기도 한다. 이에 대응하여 많은 현대 브라우저는 서드파티 쿠키를 제한하는 정책을 도입하고 있으며, 개발자들은 사용자 프라이버시를 더 잘 보호하는 대체 기술을 모색하고 있다.

Local Storage는 웹 개발의 편의성을 크게 높인 기술이지만, 그 이름 때문에 종종 오해를 불러일으키기도 한다. 'Local'이라는 표현이 오프라인 상태에서만 사용 가능한 저장소로 오인될 수 있으나, 실제로는 온라인 환경에서도 정상적으로 동작하는 클라이언트 측 저장소이다. 이 기술은 사용자의 로컬 기기, 즉 웹 브라우저가 설치된 컴퓨터나 스마트폰에 데이터를 저장한다는 점에서 'Local'이라는 명칭이 붙었다.
초기 웹 애플리케이션은 사용자 상태를 유지하기 위해 주로 쿠키(Cookie)에 의존했다. 그러나 쿠키는 매 HTTP 요청마다 서버로 전송되어 대역폭을 낭비하고, 저장 용량도 매우 제한적이었다. 이러한 한계를 극복하기 위해 HTML5 표준의 일부로 도입된 웹 스토리지 API, 그중에서도 영구 저장이 가능한 Local Storage는 프론트엔드 개발에 혁신을 가져왔다. 이를 통해 더 풍부한 사용자 경험을 제공하는 싱글 페이지 애플리케이션(SPA)의 발전에도 기여했다.
Local Storage는 사용이 간편하다는 장점이 있지만, 민감한 정보를 저장하는 데는 적합하지 않다. 저장된 데이터는 자바스크립트를 통해 쉽게 접근할 수 있으며, 브라우저의 개발자 도구에서도 누구나 확인 가능하기 때문이다. 따라서 비밀번호나 개인 신용정보와 같은 중요한 데이터는 절대 Local Storage에 저장해서는 안 된다. 보안이 필요한 데이터는 서버 측에 암호화되어 저장되거나, 인증 토큰과 같은 수단을 통해 관리하는 것이 올바른 방법이다.
또한, Local Storage는 동기(Synchronous) API라는 점도 주의할 필요가 있다. 데이터를 저장하거나 읽어올 때 작업이 완료될 때까지 자바스크립트 실행이 차단된다. 이는 대량의 데이터를 처리할 때 사용자 인터페이스가 멈춰 보이는 현상을 일으킬 수 있다. 대용량이나 복잡한 구조의 데이터를 다루어야 할 경우에는 비동기 방식으로 동작하는 IndexedDB를 사용하는 것이 더 나은 선택이 될 수 있다.