http 프로토콜의 무상태성을 보완해주는 도구
서버에서 클라이언트에 영속성 있는 데이터를 저장하는 방법
(서버는 클라이언트의 쿠키를 이용해 데이터를 가져올 수 있음)
보안을 목적으로 만들어진 것이 아님
서버에서 클라이언트에 쿠키를 전송 / 클라이언트에서 서버로 쿠키를 다시 전송
Client -> Server : set-cookie
Server -> Client : cookie
쿠키는 헤더를 통해 전달됨(내가 만든 쿠키 헤더에 담아 보내지~)
서버와 요청의 도메인이 일치하는 경우 쿠키 전송
서버에 접속할 수 있는 이름
(포트나 서브 도메인 정보, 세부 경로 등은 포함하지 않음)
http://www.localhost.com:3000/users/login
의 경우localhost.com
쿠키 옵션에 도메인 정보가 존재하는 경우, 클라이언트에선 쿠키의 도메인 옵션과 서버의 도메인이 일치해야만 쿠키 전송
서버의 요청의 세부 경로가 일치하는 경우 쿠키 전송
세부 경로, 서버가 라우팅할 때 사용하는 경로
http://www.localhost.com:3000/users/login
의 경우/users/login
/
로 설정)설정된 경로를 포함하는 하위 경로로 요청해도 쿠키를 서버에 전송 가능
(/users
로 설정된 경우 /users/abcde
로도 전송 가능)
쿠키가 유효한 기간을 정하는 옵션(보안을 위해 설정)
쿠키가 유효한 시간을 초 단위로 설정하는 옵션
언제까지 쿠키가 유효한지 날짜를 정할 수 있음
옵션의 값은 클라이언트의 시간을 기준으로 함
HTTPS에서만 쿠키 전송 여부 설정
사용하는 프로토콜에 따른 쿠키의 전송 여부 결정
해당 옵션이 true
로 설정된 경우, HTTPS를 이용하는 경우에'만' 쿠키 전송 가능
해당 옵션이 없다면 HTTP / HTTPS 모두 쿠키 전송 가능
(도메인이 localhost
인 경우 HTTPS가 아니어도 쿠키 전송 가능
개발 단계에서 localhost
를 사용하는 경우가 많기 때문에 생긴 예외)
클라이언트에서 DOM을 이용해 쿠키에 접근하는 것을 막아주는 옵션
자바스크립트로 브라우저의 쿠키에 접근이 가능한지 여부 결정
해당 옵션이 true
로 설정된 경우 자바스크립트로 쿠키 접근 불가능
기본 값은 false
, 이 경우 document.cookie
를 이용해 자바스크립트로 쿠키에 접근 가능하기 때문에 쿠키가 탈취될 위험 있음
Cross-Origin 요청을 받은 경우, 요청에 사용한 메소드와 해당 옵션의 조합을 기준으로 서버의 쿠키 전송 여부 결정
사용 가능한 옵션
- Lax : Cross-Origin 요청이라면
GET
메소드만 쿠키 전송 가능- Strict : 가장 엄격한 옵션. Cross-Origin이 아닌
same-site
인 경우에만 쿠키 전송 가능- None : 가장 관대한 옵션. 항상 쿠키를 보내줄 수 있음. 다만 쿠키 옵션에
Secure
옵션 필요
same-site
는 Origin과 도메인, 프로토콜, 포트가 모두 같은 경우를 의미
서버에서 이러한 옵션들을 지정하면 다음 서버에서 클라이엍트로 쿠키를 처음 전송할 때 Set-Cookie
라는 프로퍼티에 쿠키를 담아 전송
이 후 클라이언트에서 서버에 쿠키를 전송해야 한다면 클라이언트는 헤더에 Cookie
라는 프로퍼티에 쿠키를 담아 서버에 쿠키를 전송
서버는 클라이언트에 인증정보르 담은 쿠키 전송
클라이언트는 전달받은 쿠키를 서버에 요청과 함께 전송
이 과정을 통해 Stateful하게 인터넷 연결을 유지 가능
기본적으로 쿠키는 오랜 시간 유지될 수 있고 HttpOnly 옵션을 사용하지 않는 경우 쿠키가 탈취될 수 있기 때문에 민감한 정보를 담는 것은 위험함
사용자가 인증에 성공한 상태
서버의 일종의 저장소에 세션 저장
세션이 만들어질 경우 각 세션을 구분할 수 있는 세션 아이디 생성, 클라이언트에서 세션 성공을 증명할 수단으로 세션 아이디 전달
클라이언트는 쿠키를 사용해 세션 아이디를 저장
사용자가 정확한 아이디와 비밀번호를 입력한 경우, 서버는 인증에 성공했다고 판단
(인증에 따라 리소스의 접근 권한 변경)
로그인을 유지하기 위한 수단으로 쿠키 사용, 쿠키에 세션 아이디 저장
res.cookie
로 쿠키의 값을 무효한 값으로 갱신 혹은 res.clearCookie
로 쿠키 삭제로그인 | 로그아웃 |
---|---|
클라이언트 조건부 렌더링으로 Login 표시 로그인 버튼 클릭 ↓ 서버로 로그인 요청 (아이디, 비밀번호, 로그인 유지 등 정보 전달) ↓ 서버 요청을 처리해 응답(유저 정보, 세션 전달) ↓ 클라이언트 응답을 받아 상테 업데이트 조건부 렌더링으로 로그인 이후 페이지(MyPage 등) 표시 | 클라이언트 로그아웃 버튼 클릭 서버에 로그아웃 요청 ↓ 서버 로그아웃 처리(세션 삭제) ↓ 클라이언트 상태 비우기 조건부 렌더링으로 Login 표시 |
Node.js에서 세션을 대신 관리해주는 모듈, 세션을 위한 미들 웨어
const express = require('express');
const session = require('express-session');
const app = express();
app.use(
session({
// secret 옵션의 비밀키를 이용해 암호화, 세션 id생성
secret: '@abcdef',
resave: false,
saveUninitialized: true,
cookie: {
domain: 'localhost',
path: '/',
maxAge: 24 * 6 * 60 * 10000,
sameSite: 'none',
httpOnly: false,
secure: true,
},
})
);
secret 옵션의 비밀키를 이용, 암호화 하여 세션 id를 생성
해당 세션 id를 클라이언트에 쿠키로 전송
설명 | 접속 상태 저장 경로 | 장점 | 단점 | |
---|---|---|---|---|
Cookie | 쿠키는 그저 http의 stateless를 보완해주는 도구 | 클라이언트 | 서버에 부담을 덜어줌 | 쿠키 그 자체는 인증이 아님 |
Session | 접속 상태를 서버가 가짐 (stateful) 접속 상태와 권한 부여를 위해 세션아이디를 쿠키로 전송 | 서버 | 신뢰할 수 있는 유저인지 서버에서 추가로 확인 가능 | 하나의 서버에서만 접속 상태를 가지므로 분산에 불리함 |