본문 바로가기
Archive

Cookie 와 session 으로 인증관리하기

by livemehere 2022. 7. 31.

response 헤더에 쿠키 추가하기

app.get("/setCookie", (req, res) => {
  res.append("Set-Cookie", "name2=kong");
  res.json("done");
});

Path, HttpOnly

Path는 특정 경로에 쿠키를 저장하고, httpOnly 옵션을 주면 javascript로 접근하지 못하도록 해서 보안을 강화한다.

res.append("Set-Cookie", "name3=kong; Path=/home; HttpOnly;");

path, httponly 옵션이 적용된 모습

Document.cookie

브라우저에서는 쿠키 값을 자바스크립트로 조회,수정,삭제를 할 수 있는데, httpOnly옵션이 적용되어있으면 인식하지 못한다.

console.log(document.cookie); //name=kong

maxAge, expires

expires(유효 일자)나 max-age(만료 기간) 옵션이 지정되어있지 않으면, 브라우저가 닫힐 때 쿠키도 함께 삭제됩니다. 이런 쿠키를 "세션 쿠키(session cookie)"라고 부릅니다.

expires 나 max-age 옵션을 설정하면 브라우저를 닫아도 쿠키가 삭제되지 않습니다.

 

쿠키 유효일자는 반드시 GMT를 사용해야하는데, 이는 UTC와 동일하기 때문에 간단히

new Date().toUTCString() 를 사용하면 된다.

const date = new Date(Date.now() + 1000 * 3).toUTCString();
res.append("Set-Cookie", "name=kong; Path=/; HttpOnly; expires=" + date);

max-age 사용

res.append("Set-Cookie", "name=kong; Path=/; HttpOnly; max-age=3"); // 초단위 = 3초

쿠키 삭제하기

쿠키를 삭제하는 방법은 만료기간을 만료시키면된다.

res.append("Set-Cookie", "name=kong; max-age=-1;");

append로 직접 쿠키설정과 cookieParser의 차이

maxAge 가 cookie()메서드에서는 ms단위인데, 헤더에 직접할 경우에는 초단위 이다.

res.cookie("rememberme", "1", { maxAge: 1000, httpOnly: true });
res.append("Set-Cookie", "name=ha; max-age=3");

Signed로 쿠키 암호화 하기

cookieParser를 추가할때, 암호화 키를 전달하면, 암호화 옵션을 활성화 할수있고, 참조도 signedCookies에서만 할 수 있다.

app.use(cookieParser("kong")); // 암호화 키 추가
console.log(req.signedCookies); // req.cookies 와 다름
res.cookie("rememberme", "1", { maxAge: 3000, signed: true }); //암호화 옵션 true

Domain옵션

domain을 지정하면, subdomain에도 적용이 된다.

 

ex) http://test.com , http://m.test.com 

 

Session과 cookie

http요청의 특징중 하나는 stateless 하다는 점이다.

서버입장에서는 매요청이 독립적이기 때문에, 이미 방문했던 브라우저같은 정보를 식별하기가 어렵다.

그때 쿠키를 활용해서, 브라우저에 특정한 값을 심어두고, 다음번 방문할때 쿠키를 보고, 어떤 브라우저인지 식별이가능한 것이다.

 

그런데 Cookie는 secure, httpOnly, signed 의 보안적인 요소들을 가지고있지만, 여전히 민감한 정보를 저장하기에는 불안전하다.

그래서 민감한 요소는 서버에서 저장하고, 쿠키에는 서버에 저장된 정보를 찾을 수 있는 key값을 저장하는 방식을 사용한다.

그 서버의 저장소를 session으로 활용한다.

 

Cookie의활용은 load-balancing 에서도 활용된다.

서버의 부하를 분산하기위해서 로드밸런싱을 통해 여러개의 서버를 둔다.

위처럼 세션과 쿠키를 활용해서 브라우저를 식별하고있다면, 세션의 정보가 여러대의 서버에 나누어져 있기때문에, 세션정보가 공유되지 못하는 문제가 발생한다.

브라우저는 서버에 접근할때는 랜덤하거나, 순차적으로오는 라운드로빈 방식으로 한다면, 세션정보가 불일치하게 된다

이때 쿠키에 서버를 식별할 수 있는 값을 저장해두고, 로드밸런싱할때, 그 값에 해당하는 서버로 라우팅 시키는 방식으로 활용되기도 한다.

 

Session 만들기

세션의 저장공간은 총 3가지가 된다.

1. 파일

2. DB

3. 메모리

 

 

npm i express-session
app.use(
  session({
    secret: "kong-session",
    cookie: { maxAge: 1000 * 30 },
    resave: false,
    saveUninitialized: false,
  })
);

 

반응형