인턴

쿠기(Cookie)와 토큰(Token)의 설명

choijming21 2025. 4. 4. 09:29

웹 개발을 하다보면 인증 방식에 대해 고민하게 됩니다. 이때 가장 기본이 되는 개념이 '쿠키'와 '토큰'입니다. 

 

🍪 쿠키(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를 통해 암호화되어 전송되므로 보안성이 높습니다.

 

왜냐하면 토큰은 암호화하여 전송하고, 서버에서만 해독할 수 있기 때문에 중간에 정보가 유출될 위험이 적기 때문입니다.

 

또한, 토큰은 만료 시간을 설정할 수 있어, 일정 시간이 지나면 자동으로 무효화되는 보안 기능도 제공합니다.

 

이러한 특성 때문에 토큰은 쿠키보다 보안성이 높은 인증 방식으로 평가받고 있습니다!