Cookie
서버에서 클라이언트에 영속성있는 데이터를 저장하는 방법
단순히 서버에서 클라이언트에 쿠키를 전송하는 것만 의미하지 않고 클라이언트에서 서버로 쿠키를 다시 전송하는 것도 포함
데이터를 저장한 이후 아무 때나 데이터를 가져올 수는 없습니다. 데이터를 저장한 이후 특정 조건들이 만족되어야 다시 가져올 수 있기 때문
쿠키 옵션 종류
1. Domain
www.google.com과 같은 서버에 접속할 수 있는 이름
쿠키 옵션에서 도메인 정보가 존재한다면 클라이언트에서는 쿠키의 도메인 옵션과 서버의 도메인이 일치해야만 쿠키를 전송
2. Path
세부 경로로써 서버가 라우팅할 때 사용하는 경로를 의미
옵션의 특징은 설정된 경로를 포함하는 하위 경로로 요청을 하더라도 쿠키를 서버에 전송
3. MaxAge or Expires
유효한 기간을 정하는 옵션
MaxAge : 쿠키가 유효한 시간을 초 단위로 설정하는 옵션
Expires : MaxAge와 비슷하지만 언제까지 쿠키가 유효한지 날을 지정
옵션의 값은 클라이언트의 시간을 기준, 날짜를 초과하게 되면 쿠키는 자동으로 파괴
세션 쿠키 : MaxAge 또는 Expires 옵션이 없는 쿠키로, 브라우저가 실행 중일 때 사용할 수 있는 임시 쿠키. 브라우저를 종료하면 해당 쿠키는 삭제.
영속성 쿠키 : 브라우저의 종료 여부와 상관없이 MaxAge 또는 Expires에 지정된 유효시간만큼 사용가능한 쿠키.
4. Secure
사용하는 프로토콜에 따른 쿠키의 전송 여부를 결정하는 옵션
Secure 옵션이 true로 설정된 경우 HTTPS를 이용하는 경우에만 쿠키를 전송
5. HttpOnly
자바스크립트로 브라우저의 쿠키에 접근이 가능한지 여부를 결정
해당 옵션이 true로 설정된 경우, 자바스크립트로 쿠키에 접근이 불가
옵션을 명시하지 않는 경우에는 기본적으로 false로 지정
6. SameSite
Cross-Origin 요청을 받은 경우, 요청에서 사용한 메소드(e.g. GET, POST, PUT, PATCH …)와 해당 옵션의 조합을 기준으로 서버의 쿠키 전송 여부를 결정
- Lax: Cross-Origin 요청이라면 GET 메소드에 대해서만 쿠키를 전송.
- Strict: 단어 그대로 가장 엄격한 옵션으로, Cross-Origin이 아닌 same-site 인 경우에만 쿠키를 전송.
- None: Cross-Origin에 대해 가장 관대한 옵션으로 항상 쿠키를 보내줄 수 있습니다. 다만 쿠키 옵션 중 Secure 옵션이 필요합니다.
same-site는 요청을 보낸 Origin과 서버의 도메인, 프로토콜, 포트가 같은 경우를 말합니다. 이 중 하나라도 다르다면 Cross-Origin으로 구분
Set-Cookie
HTTP 응답 헤더는 서버에서 사용자 브라우저에 쿠키를 전송하기 위해 사용
'Set-Cookie':[
'cookie=yummy',
'Secure=Secure; Secure',
'HttpOnly=HttpOnly; HttpOnly',
'Path=Path; Path=/cookie',
'Doamin=Domain; Domain=codestates.com'
]
세션기반 인증 (Session-based Authentication)
로그인
HTTP와 같은 클라이언트-서버 프로토콜에서, 세션은 다음의 세 가지 과정으로 이루어집니다.
- 클라이언트가 TCP 연결을 수립합니다(또는 전송 계층이 TCP가 아닌 다른 적당한 연결로).
- 클라이언트는 요청을 전송한 뒤 응답을 기다립니다.
- 서버는 요청에 대해 처리하고 그에 대한 응답을 상태 코드 그리고 요청에 부합하는 데이터와 함께 돌려보냅니다.
사용자가 인증에 성공한 상태는 세션
서버는 일종의 저장소에 세션을 저장
세션이 만들어지면, 각 세션을 구분할 수 있는 세션 아이디도 만들어지는데(그림에서 3번), 보통 클라이언트에 세션 성공을 증명할 수단으로써 세션 아이디를 전달
웹사이트에서 로그인을 유지하기 위한 수단으로 쿠키를 사용
쿠키에는 서버에서 발급한 세션 아이디를 저장
쿠키를 통해 유효한 세션 아이디가 서버에 전달되고, (그림에서 5번) 세션 스토어에 해당 세션이 존재한다면 (그림에서 6번) 서버는 해당 요청에 접근 가능하다고 판단
하지만 쿠키에 세션 아이디 정보가 없는 경우, 서버는 해당 요청이 인증되지 않음
로그아웃
세션 아이디가 담긴 쿠키는 클라이언트에 저장되어 있으며, 서버는 세션을 저장
서버는 그저 세션 아이디로만 인증 여부를 판단
클라이언트에서 세션 정보를 없애기 위해서는 res.cookie로 쿠키의 값을 무효한 값으로 갱신하거나, res.clearCookie로 쿠키를 삭제
express-session
Node.js에는 이런 세션을 대신 관리해 주는 express-session 이라는 모듈이 존재
express-session은 세션을 위한 미들웨어로, express 서버에서 쉽게 세션을 위한 공간을 다룰 수 있도록 만들어 줌.
const express = require('express');
const session = require('express-session');
const app = express();
app.use(
session({
secret: '@codestates',
resave: false,
saveUninitialized: true,
cookie: {
domain: 'localhost',
path: '/',
maxAge: 24 * 6 * 60 * 10000,
sameSite: 'none',
httpOnly: false,
secure: true,
},
})
);
express-session를 사용해 위와 같이 세션의 옵션을 지정
세션의 경우 secret 옵션의 비밀키를 이용해 암호화해 세션 id라는 것을 생성
이것을 클라이언트에게 쿠키로 전송
쿠키로 전송된 세션 id는 이에 종속되는 고유한 세션 객체를 가지며 이는 서버에 저장
세션 객체는 유저별로 독립적으로 생성된 객체이므로 유저별로 각각 다른 데이터를 저장
따라서 클라이언트에 유저의 개인정보를 담지않고도 서버가 클라이언트의 세션 id를 이용해 유저의 인증여부를 판단
Cookie vs Session