1. cookie
cookie 사용
서버측
-
"npm install cookie-parser":
클라이언트에서 보내진 요청에서 헤더에 포함된 쿠키를 읽어 객체 형태로 반환할 수 있게 한다.
res.cookie()로 쿠키를 만드는것은 express에 내장된 기능
-
app.use(cookieParser()):
cookie-parser를 미들웨어로 사용한다.
-
res.cookie(cookie이름, cookie값, cookie설정 객체):
- 쿠키를 생성하고 응답헤더의 set-cookie에 담아 보낸다.
- 이름, 값은 문자열 타입이고 설정은 객체 타입이다.
- 쿠키를 생성하고 응답헤더의 set-cookie 포함시킨다. 그 후 쿠키를 받은 클라이언트는 매 요청마다 쿠키를 실어서 요청을 보낸다.
- cookie설정:
- maxAge : 쿠키의 수명을 정할 수 있다. 1000이 1초 즉 1이 1ms이다.
- expires : 쿠키 수명의 만료날짜를 지정한다 ex) new Date(2024,11,9)
- httpOnly : 클라이언트에서 쿠키값을 확인할수 있는지 여부를 결정한다. ex)true, false
- secure : https로 통신하는 경우에만 쿠키를 전송한다. ex) true, false
- path : 브라우저가 특정 url로 요청을 보낼때 요청 헤더에 쿠키를 포함시킬지 여부를 path 값을 줘서 결정한다. ex) "/login" -> /login url로 요청보낼때만 해당설정으로 생성된 쿠키를 보낸다.
- 정확히는 /login 또는 그 하위 경로 전부에 접속할때마다 쿠키를 보낸다. /login/abc/
- "/"는 모든 url에 대해서 클라이언트가 요청을 할때 쿠키를 포함시킨다는 의미
- signed : 쿠키를 생성할때 암호화할지 여부를 결정한다. ex) true, false
- true로 암호화를 시킬 때는 app.use(cookieParser("secret Key"))로 임의의 문자열을 키로 넣어준다. 보통 .env로 관리한다.
-
res.clearCookie(cookie이름,[cookie설정]):
- 서버측에서 실행되며 클라이언트의 쿠키를 만료시켜 삭제한다.
- 클라이언트로 보낼 응답헤더의 set-cookie에 동일한 이름의 쿠키의 expires 또는 max-age를 이전 시간대로 변경하고 보낸다. 응답은 받은 클라이언트에서 쿠키를 만료된 시간으로 설정하면서 더 이상 쿠키를 사용하지 않는다.
- 만약 삭제할 쿠키가 생성될때 path, domain값이 있었다면, 그와 동일한 속성을 지정해줘야한다.
생성될때 path값과 일치하지 않는 url 요청에서도 res.clearCookiee()로 쿠키 삭제가 가능하다.
마찬가지로 클라이언트로 보낼 응답헤더의 set-cookie에 동일한 이름의 쿠키를 보내는것이기 때문이다.
클라이언트측
document.cookie:
클라이언트측에서 쿠키를 읽거나 값 또는 속성을 변경할 수 있다.
- 다만 httpsOnly 값이 설정되어 있는 쿠키라면 자바스크립트로 접근할수 없고 오직 서버측에서만 접근가능하다.
- 쿠키의 expires 또는 max-age를 이전 시간대로 변경해서 서버측에서 하는것과 마찬가지로 해당 쿠키를 만료시킬 수 있다.
2. session
session 사용
서버측
npm install express-session:
express에서 세션을 관리하기 위해 필요한 모듈을 설치한다.
app.use(session(session설정 객체)):
세션을 사용을 위한 미들웨어를 등록하고 그에 맞는 설정값을 정의한다.
- 세션 쿠키의 만료기간을 명시하지 않으면 세션 쿠키가 되고 브라우저가 꺼지고 세션 쿠키는 삭제된다.(브라우저가 켜져있는 동안은 유효함)
- session설정:
- secret: 쿠키에 담기는 세션 ID의 변조를 방지하는 하기 위해 필수로 추가하는 서명(문자열)
- resave: 매 요청마다 해당 세션을 다시 저장할지 여부를 결정 ex) true, false
- 이때 저장은 세션이 서버에 다시 저장되는것만을 의미
- saveUninitialized: 초기화되지 않은 세션을 저장할지 여부를 결정 ex) true, false
- 세션에 값을 할당하지 않으면 초기화되지 않은것, 이미 값이 할당되어 있다면 초기화된것
- 이때 저장은 세션이 서버에 저장되고, 세션ID를 클라이언트로 쿠키로 보내는것을 의미
- cookie: 세션 쿠키에 대한 설정
- secure: https로 통신하는 경우에만 쿠키를 전송한다. ex) true, false
- name: 세션 쿠키의 이름을 문자열로 설정 (default는 connect.sid이다)
클라이언트가 서버측에 접속, 요청을 할때마다 세션, 세션ID가 생성된다. saveUninitialized:false라면 생성된 세션에 값을 할당(초기화)하지 않는다면 세션은 서버에 저장되지 않고 세션ID도 클라이언트측으로 보내지 않는다. true라면 값을 할당하지 않더라도 세션을 서버에 저장하고 세션ID도 클라이언트측으로 보낸다.
req.session. req.sessionID:
req.session.이름 으로 세션에 값을 저장할 수 있다.
req.session, req.sessionID로 매 요청마다의 세션과 세션ID에 접근할 수 있다.
express-session은 매 요청마다 쿠키에서 세션ID를 확인하여 해당하는 세션정보를 req.session, req.sessionID에 값을 할당해준다. 일치하는 세션이 존재하지 않는다면 새로 생성된 세션ID와 빈객체가 각각 할당된다.
req.session.destroy(콜백함수):
- 해당 세션을 삭제할 수 있다. 이때 비동기로 동작하기 때문에 콜백함수를 인자로 넣어줘야 한다.
- 서버측에서 세션 삭제를 해도 기존 클라이언트 쿠키에 세션ID는 그대로 존재한다. 따라서
res.clearCookie("connect.sid" 또는 세션쿠키명)으로 클라이언트에게 쿠키 삭제 요청을 보내서 삭제시킨다.