웹 개발을 하다보면 인증 방식에 대해 고민하게 됩니다. 이때 가장 기본이 되는 개념이 '쿠키'와 '토큰'입니다.
🍪 쿠키(Cookie)란?
쿠키는 웹사이트가 사용자의 브라우저에 저장하는 작은 데이터 파일입니다. 사용자의 세션 관리, 개인화 설정 등을 위해 사용됩니다. 웹 서버가 사용자의 브라우저에 전송하면, 브라우저가 이를 저장했다가 동일한 서버에 요청을 보낼 때 함께 잔송합니다.
🍪 쿠키의 특징:
- 클라이언트(브라우저) 측에 정보 저장됨
- 크기 제한이 있음(보통 4KB)
- 만료 날짜를 정할 수 있음
- 특정 도메인에 종속됨
🍪 쿠키의 예시:
// 서버에서 쿠키 설정 (Node.js 예시)
response.setHeader('Set-Cookie', 'username=김철수; expires=Fri, 31 Dec 2023 23:59:59 GMT; path=/');
// 브라우저에 저장된 쿠키 내용 예시
// username=김철수
🍪 쿠키의 실생활 예시:
쇼핑몰에서 장바구니에 물건을 담았는데 로그인을 하지 않은 상태라면, 쿠키를 통해 장바구니 정보를 저장합니다. 나중에 다시 접속해도 장바구니 내용이 그대로 남아있습니다.
⚙️ 토큰(Token)이란?
토큰은 인증과 권한 부여를 위해 사용되는 암호화된 문자열입니다. 주로 JWT(JSON Web Token)가 많이 사용됩니다. 서버에서 사용자 인증 후 토큰을 발급하면, 클라이언트는 이후 요청 시 해당 토큰을 함께 전송합니다.
⚙️ 토큰의 특징:
- 서버에서 생성하여 클라이언트에게 제공
- 상태를 저장하지 않음(Stateless)
- 자체적으로 정보를 포함(자체 검증 가능)
- 주로 HTTP 헤더를 통해 전송됨
⚙️ 여기서 JSON Web Token(JWT) 설명
JWT는 당사자 간에 정보를 안전하게 전송하기 위한 간결하고 독립적인 방식의 표준입니다. 디지텅 서명된 정보이기 때문에 검증되고 신뢰할 수있습니다. JWT은 점(.)으로 구분된 세 부분으로 구성됩니다:
1. 헤더(Header): 토큰 유형과 사용된 서명 알고리즘 정보를 포함
{
"alg": "HS256",
"typ": "JWT"
}
2. 페이로드(Payload): 클레임(Claim)이라 불리는 엔티티 및 추가 데이터를 포함(실제 데이터: 사용자 ID, 권한 등)
{
"sub": "1234567890",
"name": "홍길동",
"iat": 1516239022,
"exp": 1516242622
}
3. 서명(Signature): 헤더와 페이로드를 인코딩한 값이 비밀키를 사용해 생성한 서명(토큰이 변조되지 않았음을 증명)
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)
⚙️ JWT의 실제 모습
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IuydgOq4sOuPhCIsImlhdCI6MTUxNjIzOTAyMn0.nPqm5GpXFB3gmOCNI4d4EumiKnwwS3OwLH_1nDzyD6A
⚙️ JWT의 주요 사용 사례
인증(Authentifation): 사용자가 로그인 후 서버는 JWT를 발급하고, 클라이언트는 이후 요청에 이 토큰을 포함시켜 인증합니다.
⚙️ 토큰의 실생활 예시:
은행 앱에 로그인하면 서버가 토큰을 발급하고, 이후 계좌 조회나 송금 같은 기능을 사용할 때마다 해당 토큰을 함께 보내 "나는 이미 인증된 사용자입니다."라고 증명합니다.
👫 쿠키와 토큰의 주요 차이점:
1. 저장 위치:
- 🍪 쿠키: 브라우저에 저장
- ⚙️ 토큰: 클라이언트 로컬 스토리지, 세션 스토리지, 또는 쿠키에 저장 가능
2. 보안성:
- 🍪 쿠키: CSRF 공격에 취약할 수 있음
- ⚙️ 토큰: 자체 서명되어 있어 위조가 어려움
3. 사용 목적
- 🍪 쿠키: 주로 상태 유지, 사용자 설정 저장
- ⚙️ 토큰: 주로 인증 및 권한 부여
4. 서버 의존성
- 🍪 쿠키: 서버 측에서 세션을 유지해야 함
- ⚙️ 토큰: 서버가 상태를 저장할 필요가 없음(Stateless)
👫 쿠키의 보안 취약점과 토큰의 장점
쿠키는 사용자의 브라우저에 저장되기 때문에 XSS(Cross-Site Scripting)공격에 취약할 수 있습니다. 이는 공격자가 사용자의 쿠키를 탈취하여 민감한 정보에 접근할 수 있음을 의미합니다.
반면, 토큰에 서버에 생성되어 클라이언트에 전달되며, 이후 클라이언트는 토큰을 서버에 전송하여 자신을 인증합니다. 이 과정에서 토큰은 HTTPS를 통해 암호화되어 전송되므로 보안성이 높습니다.
왜냐하면 토큰은 암호화하여 전송하고, 서버에서만 해독할 수 있기 때문에 중간에 정보가 유출될 위험이 적기 때문입니다.
또한, 토큰은 만료 시간을 설정할 수 있어, 일정 시간이 지나면 자동으로 무효화되는 보안 기능도 제공합니다.
이러한 특성 때문에 토큰은 쿠키보다 보안성이 높은 인증 방식으로 평가받고 있습니다!
'인턴' 카테고리의 다른 글
[ Troubleshooting🛠️ ] Tanstack Query의 데이터 로딩 (0) | 2025.04.07 |
---|---|
[ Troubleshooting🛠️ ] CORS 문제 해결 (0) | 2025.04.07 |
React Hook Form과 Zod를 활용한 효율적인 폼 유효성 검사 (0) | 2025.04.03 |
[ Troubleshooting🛠️ ] Next.js에서 Tailwind CSS 설치 시 발생하는 오류 해결하기 (0) | 2025.04.02 |
[ Troubleshooting🛠️ ] Next.js 성능 최적화: 클라이언트 컴포넌트 분리를 통한 이미지 초기 로딩 속도 개선 (0) | 2025.04.02 |