
📅 2025-11-14
➡️ Throttling · Debouncing · Auth에 대해 새롭게 알게 된 것 또는 헷갈리는 부분 정리




import { useEffect } from 'react';
const Home = () => {
let timerId = null;
const throttle = (delay) => {
if (timerId) {
// setTimeout이 진행중인 상태, 딜레이가 경과되지 않는 상태
return;
}
console.log(`api 요청 실행 ${delay}ms 동안 추가 요청 안받아요`);
timerId = setTimeout(() => {
console.log(`${delay}ms 지남, 추가 요청 반응`);
timerId = null;
}, delay);
};
const debounce = (delay) => {
if (timerId) {
// 할당 되어 있는 timerId를 타이머에서 제거
clearTimeout(timerId);
}
timerId = setTimeout(() => {
console.log(`마지막 요청 ${delay}ms 지남, 추가 요청 반응`);
timerId = null;
}, delay);
};
useEffect(() => {
return () => {
// 언마운트 될 때, 페이지 이동 시
if (timerId) clearTimeout(timerId);
};
}, [timerId]);
return (
<div style={{ padding: 20 }}>
<h1>Throttling / Debouncing Example</h1>
<button onClick={() => throttle(2000)}>Throttle 버튼</button>
<button onClick={() => debounce(2000)}>Debounce 버튼</button>
</div>
);
};
export default Home;
배열, 객체, 문자열 등의 데이터 조작을 쉽게 할 수 있는 다양한 함수들을 제공throttle과 debounce 같은 함수도 포함되어 있음설치
npm i lodash
import { useState, useCallback } from "react";
import _ from "lodash";
function Home() {
const [searchText, setSearchText] = useState("");
const [inputText, setInputText] = useState("");
const handleSearchText = _.debounce((text) => setSearchText(text), 2000);
const handleChange = (e) => {
setInputText(e.target.value);
handleSearchText(e.target.value);
};
return (
<div
style={{
paddingLeft: 20,
paddingRight: 20,
}}
>
<h1>디바운싱 예제</h1>
<br />
<input
placeholder="입력값을 넣고 디바운싱 테스트를 해보세요."
style={{ width: "300px" }}
onChange={handleChange}
type="text"
/>
<p>Search Text: {searchText}</p>
<p>Input Text: {inputText}</p>
</div>
);
}
export default Home;
useCallback으로 함수를 memoizationconst handleSearchText = useCallback(
_.debounce((text) => setSearchText(text), 2000),
[]
);Set-Cookie 헤더로 쿠키를 내려주면, 브라우저가 자동 저장 (저장된 쿠키 정보는 개발자 도구 → 애플리케이션 → 저장용량 → 쿠키에서 확인할 수 있음)| 항목 | 쿠키 | localStorage / sessionStorage |
|---|---|---|
| 저장 위치 | 브라우저 | 브라우저 |
| 서버 자동 전송 | O | X |
| 서버에서 설정 가능 | O (Set-Cookie) | X (JS로만 조작) |
| 주 사용처 | 인증(session ID, token) | 일반 데이터 |
Origin = Protocol + Host + Port

CORS
사용 예시
세션 + 쿠키 인증 방식
로그인/회원가입 시 세션 인증

로그인/회원가입 성공 시 세션에서 쿠키에 sessionid를 담아서 보냄
세션 유지 상태: 서버에서 관리하는 세션 저장소에 회원 데이터가 있음
세션 만료 상태 : 서버에서 관리하는 세션 저장소에 회원데이터 없음
인가 필요한 API 요청/응답
서버는 인가가 필요한 API 요청을 받으면 클라이언트 쿠키에 들어 있는 sessionid를 세션 저장소에 조회하고, 있으면 DB에 데이터를 조회하고 응답함
→ 이런 한계들을 보안하기 위해 등장한 게 토큰 기반 인증, JWT(JSON Web Token) 기반 인증
| 구분 | 암호화(Encryption) | 인코딩(Encoding) |
|---|---|---|
| 목적 | 보안 | 전달/저장 편의 |
| 특징 | 키가 있어야 복호화 가능 | 누구나 복원 가능 |
| 사용 예 | 비밀번호, 민감 정보 보호 | Base64, URL 인코딩 |
국제 표준 규격 → 다양한 언어/플랫폼에서 사용 가능
Payload는 누구나 디코딩해서 읽을 수 있음 → 기밀 보호용이 아니라 위조 방지용
서버만 알고 있는 secret key가 있어야 signature 검증 가능
→ 이 키가 일치해야 토큰이 조작되지 않았다는 걸 확인할 수 있음