cookie / session

gogigogigogi·2024년 12월 10일

서버측

  • "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" 또는 세션쿠키명)으로 클라이언트에게 쿠키 삭제 요청을 보내서 삭제시킨다.

0개의 댓글