쿠키, 세션, 토큰의 차이점에 대해 설명해주세요.
면접용 답변
쿠키는 클라이언트에 저장되는 데이터로, 요청 시 자동으로 서버에 함께 전송됩니다. 세션은 서버에 사용자 상태를 저장하고, 클라이언트는 세션 ID가 담긴 쿠키만 전달해 사용자를 식별합니다. 그리고 토큰은 로그인 시 발급된 인증 정보를 담은 문자열로, 클라이언트가 직접 저장하고 요청마다 헤더에 담아 서버에 전달합니다.
개념 정리
쿠키
클라이언트(브라우저)에 저장되는 작은 텍스트 조각으로, 서버와 클라이언트 간 상태를 유지하는 수단
특징
브라우저에 저장되고, 사용자가 요청할 때마마 함께 전송된다.
도메인/경로 기반으로 설정 가능해 특정 사이트에서만 유효하다.
만료 시간이 지나면 자동으로 삭제된다.
Secure, HttpOnly, SameSite 속성으로 보안 강화가 가능하다.
활용 예시
자동 로그인 정보
최근 본 상품 목록
세션
서버 측에서 사용자 상태 정보를 저장하는 방식으로, 클라이언트에게 세션 ID를 담은 쿠키를 전달하고 이를 통해 사용자를 식별하며 상태를 관리
동작 흐름
사용자가 로그인을 한다.
서버는 고유한 SessionID를 생성한다.
서버는 이 SessionID를 쿠키에 담아 클라이언트에 전달한다.
클라이언트는 이후 요청 시 해당 쿠키(SessionID)를 자동으로 포함해 요청을 보낸다.
서버는 전달 받은 SessionID를 기반으로 사용자 정보를 조회해 유저를 식별한다.
특징
서버가 사용자의 상태를 기억하는 Stateful한 방식이다.
사용자 정보(SessionID)를 DB에 저장해야 한다. → 서버 메모리/DB 리소스 추가로 소모하게 된다.
세션이 만료되면 자동으로 삭제된다.
꼬리 질문
토큰
사용자 인증 정보를 담은 문자열로, 서버는 토큰을 검증할 뿐 사용자 상태 정보를 직접 저장하지는 않는다.
동작 흐름 (대표적인 예시인 JWT(Json Web Token)를 기준으로)
사용자가 로그인을 한다.
서버는 사용자 정보를 바탕으로 JWT를 생성한다. (서명 포함)
클라이언트는 전달 받은 JWT를 저장한다. (로컬 스토리지, 세션 스토리지, 쿠키 등에 저장 가능)
이후 요청 시 JWT를 Authorization: Bearer 헤더에 포함해 보낸다.
서버는 JWT 서명을 검증한 뒤 유효하면 사용자 인증에 성공한 것이다.
특징
Stateless한 인증 방식
서버는 사용자의 인증 상태를 저장하지 않고, 요청마다 토큰을 검증해 처리합니다. 서버 확장 및 마이크로서비스 환경에서 유리하다.
자체에 사용자 정보 포함
JWT는 Payload에 사용자 ID, 권한 등의 정보를 담을 수 있으며, 이는 Base64로 인코딩되어 누구나 열람할 수 있다. → 민감한 정보는 포함시키면 안된다.
서명(Signature)을 통한 위/변조 방지
서버는 서명을 검증함으로써 토큰의 위/변조 여부를 확인할 수 있다.
토큰 탈취 시 보안 취약점 발생 가능
JWT는 유효 기간 내라면 누구든 사용할 수 있기 때문에, HTTPS 사용은 필수이며 가능한 만료 시간을 짧게 설정해야 한다.
재발급 로직 필요
토큰 만료 시 자동 로그아웃 방지 등을 위해 Refresh Token을 이용한 재발급 로직이 필요하다.
세션 & 쿠키 vs 토큰
저장 위치
세션: 서버 / 쿠키: 클라이언트
클라이언트 (로컬 스토리지, 세션 스토리지 등)
인증 방식
서버가 세션 ID로 사용자 상태를 조회
서버가 토큰의 유효성만 검증
상태 관리
상태를 서버에 저장 (Stateful)
상태를 저장하지 않음 (Stateless)
서버 리소스
사용자 수에 따라 세션 저장 공간 필요
서버는 상태 저장 불필요 → 자원 절약 가능
보안
세션 ID 탈취 시 위험하지만 서버에서 관리 가능
토큰 탈취 시 누구나 내용을 확인할 수 있고, 유효 기간 내라면 악용 가능
확장성
서버에 저장 공간이 필요해 확장성에 한계 있음
서버 간 공유 불필요해 수평 확장에 유리
꼬리 질문
JWT에 민감한 정보를 담으면 안 되는 이유는 뭔가요?
세션 방식은 어떤 단점이 있나요?
토큰은 Stateless한데, 로그아웃은 어떻게 처리하나요?
세션/토큰 방식 중 어떤 경우에 각 방식을 사용할지 설명해보세요.
Last updated