-
Cookie / SessionFE 2023. 7. 2. 23:44
Cookie : 서버에서 클라이언트에 영속성 있는 데이터를 저장하는 방법
서버에서 클라이언트에 쿠키를 전송하는 것만 의미하지 않고 클라이언트에서 서버로 쿠키를 다시 전송하는 것도 포함됨
데이터를 저장한 이후 아무때나 데이터를 가져올 수 없음. 데이터를 저장한 이후 특정 조건들이 만족되어야 다시 가져올 수 있기 때문
'Set-Cookie':[ 'cookie=yummy', 'Secure=Secure; Secure', 'HttpOnly=HttpOnly; HttpOnly', 'Path=Path; Path=/cookie', 'Doamin=Domain; Domain=codestates.com' ]
➡️ http 헤더를 사용해 쿠키 옵션으로 표현
쿠키 옵션 종류
- Domain : 흔히 사용하는 www.google.com과 같은 서버에 접속할 수 있는 이름
쿠키 옵션에서 도메인 정보가 존재한다면 클라이언트에서는 쿠키의 도메인 옵션과 서버의 도메인이 일치해야 쿠키를 전송할 수 있음 - Path : 세부 경로로써 서버가 라우팅할 때 사용하는 경로. (/users/login 과 같은)
- MaxAge or Expires : 쿠키가 유효한 기간을 정하는 옵션
MaxAge는 쿠키가 유효한 시간을 초 단위러 설정하는 옵션, Expires는 언제까지 쿠키가 유효한지 심판의 날을 지정
옵션의 여부에 따라 세션쿠키와 영속성 쿠키로 나눌 수 있음 - Secure : 사용하는 프로토콜에 따른 쿠키의 전송 여부를 결정하는 옵션 (Secures 옵션이 true로 설정된 경우 HTTPS를 이용하는 경우에만 쿠키를 전송할 수 있음)
- HttpOnly : 자바스크립트로 브라우저의 쿠키에 접근이 가능한지 여부를 결정 (해당 옵션이 true일 경우, 자바스크립트로 쿠키에 접근 불가)
- SameSite : Cross-Site 요청을 받은 경우, 요청에서 사용한 메서드(e.g. GET, POST, PUT, PATCH..)와 해당 옵션의 조합을 기준으로 서버의 쿠키 전송 여부를 결정
Cross-Origin은 서버의 도메인, 프르토콜, 포트 중 하나라도 다른 경우 Cross-Origin으로 구분 / Cross-Site는 eTLD+1이 다른 경우 Cross-Site로 구분
옵션 : Lax(GET 메서드에 대해서만 쿠키 전송), Strict(엄격한 옵션 Same-Site인 경우만 쿠키 전송), None(관대한 옵션으로 항상 쿠키 전송)이 있음
쿠키를 이용한 상태 유지
➡️ 기본적으로 쿠키는 오랜 시간 동안 유지될 수 있고, HttpOnly 옵션을 사용하지 않았다면 자바스크립트를 이용해서 쿠키에 접근할 수 있기 때문에 쿠키에 민감한 정보를 담는 것은 위험
세션기반 인증 (Session-based Authentication)
로그인
서버 : 사용자가 인증에 성공했음을 알아야함
클라이언트 : 인증 성공을 증명할 수단을 갖고 있어야 함
세션 : 사용자가 인증에 성공한 상태 (서버는 일종의 저장소에 세션을 저장하는데 주로 in-memory 또는 세션 스토어에 저장함)
➡️ 세션이 만들어지면 각 세션을 구분할 수 있는 세션 아이디도 만들어지는데 보통 클라이언트에 세션 성공을 증명할 수단으로써 세션 아이디를 전달함. 웹 사이트에서 로그인을 유지하기 위한 수단으로 쿠키 사용. 쿠키에는 서버에서 발급한 세션 아이디 저장
로그아웃
서버 : 세션 정보를 삭제
클라이언트 : 쿠키를 변경하거나 삭제
➡️ 세션 아이디가 담긴 쿠키는 클라이언트에 저장되며 서버는 세션을 저장하고 세션 아이디로 인증여부를 판단. 정보를 삭제하기 위해서 res.cookie로 쿠키의 값을 무효한 값으로 변경 또는 res.clearCookie로 쿠키를 삭제
express-session
세션을 위한 미들웨어, express 서버에서 쉽게 세션을 위한 공간을 다룰 수 있도록 만들어줌
세션의 옵션을 지정하여 secret 옵션의 비밀키를 이용해 암호화해 세션 Id 생성 후 클라이언트에게 쿠키로 전송.
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, }, }) );
- Domain : 흔히 사용하는 www.google.com과 같은 서버에 접속할 수 있는 이름