Cookie
- 쿠키는 클라이언트(브라우저)에 작은 데이터(key-value 쌍)를 저장하는 방식.
- 서버는 응답 시 쿠키를 생성하여 클라이언트에 저장시키고, 클라이언트는 이후 모든 요청에 자동으로 쿠키를 함께 보냄.
- 로그인 유지, 테마 설정, 최근 검색어 등에 사용됨.
Cookie nameCookie = new Cookie("username", "유진");
nameCookie.setMaxAge(60 * 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라는 쿠키만 가지고, 실데이터는 서버에 저장됨.
- 로그인 정보, 장바구니, 마이페이지 등 서버 내부 상태가 필요한 기능에 사용됨.
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 등
String jwt = Jwts.builder()
.setSubject("user123")
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + 3600000))
.signWith(SignatureAlgorithm.HS256, "secretkey")
.compact();
response.setHeader("Authorization", "Bearer " + jwt);
String token = request.getHeader("Authorization").replace("Bearer ", "");
Claims claims = Jwts.parser()
.setSigningKey("secretkey")
.parseClaimsJws(token)
.getBody();
String userId = claims.getSubject();
비교표
| 항목 | Cookie | Session | JWT (JSON Web Token) |
|---|
| 저장 위치 | 클라이언트 (브라우저) | 서버 (세션 저장소 or 메모리) | 클라이언트 (토큰 자체에 정보 포함) |
| 저장 용량 제한 | 작음 (4KB 이하) | 제한 없음 (서버 메모리 제한만 고려) | 작음 (보통 수백 바이트 ~ 몇 KB) |
| 서버 확장성 | 높음 (서버 상태 불필요) | 낮음 (사용자 수 늘면 메모리 부담 증가) | 높음 (무상태 인증, 서버 부담 없음) |
| 요청 시 자동 전송 | ✅ (브라우저가 자동 전송) | ✅ (JSESSIONID 쿠키 자동 전송) | ❌ (헤더에 수동으로 전송해야 함) |
| 브라우저 간 공유 | 가능 (같은 도메인만) | 불가 | 가능 (토큰 전달만 되면 가능) |
| 보안 | 낮음 (위조/도청 가능) | 중간 (서버 관리 가능, 탈취 주의) | 높음 (서명 기반 위조 방지) |
| 로그아웃 방법 | 쿠키 삭제 (setMaxAge(0)) | session.invalidate() | 토큰 만료 or 삭제 |
| 사용 예시 | 자동 로그인, 테마, 최근 검색어 저장 | 로그인 상태 유지, 장바구니, 마이페이지 | API 인증, 모바일 로그인, OAuth 토큰 |
언제 무엇을 써야 할까?
| 상황 | 추천 방식 | 이유 |
|---|
| 로그인 상태를 서버에서 유지하고 싶다 | Session | 사용자 식별과 데이터 유지가 서버 중심 |
| 자동 로그인, 테마 저장 | Cookie | 클라이언트 저장에 적합하며 가벼움 |
| 모바일 앱 인증, REST API | JWT | 서버가 상태를 기억할 필요 없는 구조 |
| 확장성 높은 인증 시스템 구축 | JWT | 서버 세션 부담 없고 분산처리에 강함 |
| 사용자가 설정한 색상, 언어 등 UI 저장 | Cookie | 프론트 쪽에 저장만 하면 됨 |