development

자바스크립트 localStorage Expiry(만료시간) 설정

나는산타 2022. 9. 23. 13:16
반응형

브라우저 로컬스토리지(localStorage) 만료시간 설정하기

 

localStorage에서는 만료 시간을 제공하지 않는다하지만 자바스크립트 사용하여 TTL(Time to Live) 추가하여 특정 기간이 경과한 localStorage 항목을 무효화할 있다.

 

아래 처럼 만료시간을 설정하면 된다.

 

  1. 저장될 원본 정보와 함께 예상 만료 시간을 저장
  2. 데이터 조회 시, 현재 시간과 저장된 만료 시간을 비교
  3. 현재 시간이 저장된 만료 시간보다 크면 null 반환 후 저장소에서 제거하고, 그렇지 않으면 원래 정보를 반환

 

만료 시간이 있는 항목 저장

localStorage 키를 설정하고 만료 시간을 함께 저장할 있는 함수

function setWithExpiry(key, value, ttl) {
	const now = new Date()

	// `item` is an object which contains the original value
	// as well as the time when it's supposed to expire
	const item = {
		value: value,
		expiry: now.getTime() + ttl,
	}
	localStorage.setItem(key, JSON.stringify(item))
}

 

여기에서 현재 ms 시간에 ms 단위의 TTL 값을 더하여 계산되는 만료 시간과 원래 값을 사용하여 개체를 만든다.

 

localStorage에는 문자열만 저장할 있으므로 항목을 JSON 문자열로 변환한다.

 

저장소에서 항목 가져오기

localStorage에서 항목을 검색하는 동안 만료 시간을 확인할 있다.

function getWithExpiry(key) {
	const itemStr = localStorage.getItem(key)
	// if the item doesn't exist, return null
	if (!itemStr) {
		return null
	}
	const item = JSON.parse(itemStr)
	const now = new Date()
	// compare the expiry time of the item with the current time
	if (now.getTime() > item.expiry) {
		// If the item is expired, delete the item from storage
		// and return null
		localStorage.removeItem(key)
		return null
	}
	return item.value
}

 

localStorage에서 데이터 검색할 때만 만료 조건을 확인한다. 데이터가 만료된 경우 localStorage에서 키를 제거한다.

 

 

전체 코드

만료된 localStorage 사용하는 방법을 보여주는 작은 HTML 페이지

 

  1. “Set" 버튼은 입력 상자의 값을 5 만료로 localStorage 저장
  2. "Get" 버튼은 localStorage에서 값을 가져와 아래에 표시
  3. 스크립트에 정의된 setWithExpiry  getWithExpiry 기능 사용
<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="UTF-8" />
		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
		<meta http-equiv="X-UA-Compatible" content="ie=edge" />
		<title>LocalStorage Expiry Example</title>
	</head>

	<body>
		<button id="btn-set">Set</button>
		<input id="input-set" />
		<br /><br />
		<button id="btn-get">Get</button>
		<div>Value: <span id="value"></span></div>

		<script>
			const btnSet = document.getElementById("btn-set")
			const btnGet = document.getElementById("btn-get")
			const inputSet = document.getElementById("input-set")
			const valueDisplay = document.getElementById("value")

			btnSet.addEventListener("click", () => {
				setWithExpiry("myKey", inputSet.value, 5000)
			})

			btnGet.addEventListener("click", () => {
				const value = getWithExpiry("myKey")
				valueDisplay.innerHTML = value
			})

			function setWithExpiry(key, value, ttl) {
				const now = new Date()

				// `item` is an object which contains the original value
				// as well as the time when it's supposed to expire
				const item = {
					value: value,
					expiry: now.getTime() + ttl,
				}
				localStorage.setItem(key, JSON.stringify(item))
			}

			function getWithExpiry(key) {
				const itemStr = localStorage.getItem(key)

				// if the item doesn't exist, return null
				if (!itemStr) {
					return null
				}

				const item = JSON.parse(itemStr)
				const now = new Date()

				// compare the expiry time of the item with the current time
				if (now.getTime() > item.expiry) {
					// If the item is expired, delete the item from storage
					// and return null
					localStorage.removeItem(key)
					return null
				}
				return item.value
			}
		</script>
	</body>
</html>

 

참고

- https://www.sohamkamani.com/javascript/localstorage-with-ttl-expiry/

반응형