공부방
쿠키 vs 세션 vs 토큰 본문
쿠키, 세션, 토큰이 필요한 이유?
- 웹사이트는 기본적으로 Stateless(기억을 못함)
- 그래서 로그인 했다는 걸 기억하게 해주는 도구가 필요하다.
쿠키(Cookie)
- 브라우저(클라이언트)가 정보를 직접 저장하는 작은 메모
- 저장 위치 : 브라우저(내 컴퓨터)
- 용량 : 작음(4KB 정도)
- 보안 : 조심해야 한다 -> 탈취 가능성
- 유지 기간 : 직접 정할 수 있다 (만료일 있음)
- 예 : 교복을 입고 교실에 들어가 이름표를 달고 다닌다.
- 쿠키 : 이름표
- 서버는 쿠키를 보고 누가 누군지 알 수 있음
언제 쓰냐?
- 로그인 후, "자동 로그인" 하고 싶을 때
- 장바구니 정보를 브라우저에 저장해두고 싶을 때
- 쿠키는 HTTP 헤더에 실려서 서버로 자동 전송된다.
GET /profile
Cookie: sessionId=abc123; theme=dark;
- 브라우저를 열 때마다, 쿠키는 서버에 자동으로 따라간다.
- 쿠키를 만들 때 옵션이 있다.
Cookie cookie = new Cookie("userId", "hyun123");
cookie.setMaxAge(3600); // 유효 시간: 1시간
cookie.setSecure(true); // HTTPS에서만 전송
cookie.setHttpOnly(true); // JS에서 접근 못하게
- HttpOnly : 해커가 자바스크립트로 훔치지 못하게 막는다.
- Secure : https 연결에서만 쿠키 전송
세션(Session)
- 서버에 정보를 저장하고, 브라우저는 세션 ID만 가지고 다닌다.
- 저장 위치 : 서버
- 브라우저 : 세션 ID만 기억
- 보안 : 쿠키보다 안전하다
- 유지 기간 : 일정 시간 후 자동 만료 (ex. 30분)
- 예 : 이름표를 붙이는 것이 아니라 교실 선생님한테 이름들을 등록해두고 다음엔 누가 누군지 ID 카드를 보여주는 것
- 세션 = 선생님 머릿속 기억장부
- 세션 ID = 나만 가진 출입카드
언제 쓰냐?
- 민감한 정보 (ex. 사용자 정보)는 절대 브라우저에 저장하고 싶지 않을 때
- 세션의 흐름
- 사용자가 로그인함
- 서버가 유저 정보를 세션에 저장(예 : sessionId = abc123)
- 서버는 이 sessionId를 쿠키로 준다.
- 사용자는 다음부터 쿠키에 sessionId = abc123 넣어서 요청
- 서버가 메모리에 유저 정보를 들고 있다.
session.setAttribute("userId", "hyun123");
String userId = (String) session.getAttribute("userId");
- 서버 메모리를 많이 쓰니까 많은 사용자가 접속하면 부담이 커진다.
- 그래서 대형 시스템은 세션을 DB나 Redis에 저장하기도 한다.
토큰(Token, 주로 JWT)
- 내 정보와 서명을 담은 전자 인감증명서 같은 것
- 저장 위치 : 보통 브라우저 (localStorage, sessionStorage 등)
- 보안 : 도난 당하면 위험 -> https 꼭 필요
- 서버 : 아무것도 저장 안 함 (Stateless)
- 특징 : 모바일 / SPA(리액트 등)와 잘 어울림
- 예 : 학교에서 내가 누군지, 어떤 반인지 정보가 다 들어 있는 인증서를 만들어줘 이 인증서를 들고 어디든지 다닌다.
- 토큰 = 정보 + 도장 찍힌 전자 문서
- 내가 직접 들고 다님
- 서버는 이게 진짜 인증된 건지 검증만 하고, 따로 기억(보관)은 하지 않는다.
언제 쓰냐?
- 서버가 사용자 정보를 기억하지 않아야 할 때
- 모바일 앱이나 SPA(React, Vue) 같은 데서 또는 마이크로서비스 구조일 때
- 토큰이 어떻게 생겼나?
xxxxx.yyyyy.zzzzz
- Header : 이건 JWT고, 서명은 HMAC256이다.
- Payload : {"userId" : "hyun123", "role" : "admin"}
- Signature : 이 토큰이 위조되지 않았는지 확인하는 서명
- 왜 서버가 저장하지 않아도 되냐?
- 토큰 안에 모든 정보가 들어있다.
- 서버는 토큰을 받고 이게 진짠지 확인만 한다. (서명 검증)
- 예시 흐름
- 로그인 성공 -> 서버가 JWT 생성
- 클라이언트(localStorage 등)에 저장
- 이후 요청 시(밑 코드)
- 서버는 서명을 검증해서 이게 진짠지 위조된게 아닌지 확인만 하면 된다.
GET /mypage
Authorization: Bearer xxxxx.yyyyy.zzzzz
'문법' 카테고리의 다른 글
Java의 예외 처리 (0) | 2025.03.24 |
---|---|
JVM(Java Virtual Machine) (1) | 2025.03.24 |
자바 스레드(Thread)? (0) | 2025.03.24 |
프로세스(Process) vs 스레드(Thread)를 쉽게 알아보기 (0) | 2025.03.20 |