Cookie vs Session vs JWT

임유진·2025년 7월 22일

목록 보기
3/7
post-thumbnail
  • 쿠키는 클라이언트(브라우저)에 작은 데이터(key-value 쌍)를 저장하는 방식.
  • 서버는 응답 시 쿠키를 생성하여 클라이언트에 저장시키고, 클라이언트는 이후 모든 요청에 자동으로 쿠키를 함께 보냄.
  • 로그인 유지, 테마 설정, 최근 검색어 등에 사용됨.
  • Java Servlet 예제
// 쿠키 생성 및 클라이언트에 전송
Cookie nameCookie = new Cookie("username", "유진");
nameCookie.setMaxAge(60 * 30); // 30분 유지
response.addCookie(nameCookie);

// 클라이언트가 전송한 쿠키 확인
Cookie[] cookies = request.getCookies();
if (cookies != null) {
   for (Cookie c : cookies) {
       if (c.getName().equals("username")) {
           out.println("쿠키 값: " + c.getValue());
       }
   }
}

Session

  • 세션은 서버에서 클라이언트를 식별하고 상태를 유지하기 위한 방법.
  • 클라이언트는 JSESSIONID라는 쿠키만 가지고, 실데이터는 서버에 저장됨.
  • 로그인 정보, 장바구니, 마이페이지 등 서버 내부 상태가 필요한 기능에 사용됨.
  • Java Servlet 예제
// 세션 생성 또는 가져오기
HttpSession session = request.getSession();
session.setAttribute("userId", "user123");

// 세션에서 데이터 꺼내기
String userId = (String) session.getAttribute("userId");
out.println("세션 사용자 ID: " + userId);

// 세션 종료 (로그아웃 처리)
session.invalidate();

3. JWT (JSON Web Token)

  • JWT는 로그인 상태를 유지하는 토큰 기반 인증 방식.
  • 서버는 사용자가 로그인하면 토큰을 발급하고,
  • 클라이언트는 이후 요청 시 Authorization: Bearer <token> 헤더로 토큰을 보냄.
  • 서버는 토큰을 서명 검증만 하고 상태를 저장하지 않음 (stateless).
  • 주로 모바일 앱, REST API 인증, 마이크로서비스 간 인증 등에 사용됨.
  • Java 예제 (JJWT 라이브러리 사용)
  • JJWT 라이브러리 필요: io.jsonwebtoken:jjwt-api, jjwt-impl, jjwt-jackson
// JWT 생성
String jwt = Jwts.builder()
   .setSubject("user123")
   .setIssuedAt(new Date())
   .setExpiration(new Date(System.currentTimeMillis() + 3600000)) // 1시간 유효
   .signWith(SignatureAlgorithm.HS256, "secretkey")
   .compact();

// 응답에 JWT 포함
response.setHeader("Authorization", "Bearer " + jwt);

// JWT 파싱 및 검증
String token = request.getHeader("Authorization").replace("Bearer ", "");
Claims claims = Jwts.parser()
   .setSigningKey("secretkey")
   .parseClaimsJws(token)
   .getBody();

String userId = claims.getSubject();

비교표

항목CookieSessionJWT (JSON Web Token)
저장 위치클라이언트 (브라우저)서버 (세션 저장소 or 메모리)클라이언트 (토큰 자체에 정보 포함)
저장 용량 제한작음 (4KB 이하)제한 없음 (서버 메모리 제한만 고려)작음 (보통 수백 바이트 ~ 몇 KB)
서버 확장성높음 (서버 상태 불필요)낮음 (사용자 수 늘면 메모리 부담 증가)높음 (무상태 인증, 서버 부담 없음)
요청 시 자동 전송✅ (브라우저가 자동 전송)✅ (JSESSIONID 쿠키 자동 전송)❌ (헤더에 수동으로 전송해야 함)
브라우저 간 공유가능 (같은 도메인만)불가가능 (토큰 전달만 되면 가능)
보안낮음 (위조/도청 가능)중간 (서버 관리 가능, 탈취 주의)높음 (서명 기반 위조 방지)
로그아웃 방법쿠키 삭제 (setMaxAge(0))session.invalidate()토큰 만료 or 삭제
사용 예시자동 로그인, 테마, 최근 검색어 저장로그인 상태 유지, 장바구니, 마이페이지API 인증, 모바일 로그인, OAuth 토큰

언제 무엇을 써야 할까?

상황추천 방식이유
로그인 상태를 서버에서 유지하고 싶다Session사용자 식별과 데이터 유지가 서버 중심
자동 로그인, 테마 저장Cookie클라이언트 저장에 적합하며 가벼움
모바일 앱 인증, REST APIJWT서버가 상태를 기억할 필요 없는 구조
확장성 높은 인증 시스템 구축JWT서버 세션 부담 없고 분산처리에 강함
사용자가 설정한 색상, 언어 등 UI 저장Cookie프론트 쪽에 저장만 하면 됨
profile
말하는 고구마

0개의 댓글