쿠키
클라이언트에서 서버에 무언가를 요청을 할 때마다 서버는 얘가 누군지를 모른다는 특징이 있다. 한번 연결 된다고 해서 끝이 아니라는 말.
그러면 우리가 로그인을 하고 네이버 카카오 같은 곳들을 자유롭게 활보할 수 있는 건 어떻게 하는 것일까? 위의 말대로라면 페이지가 바뀔 때마다 로그인을 해야할 것 같은데 말이지.
첫번째로 든 나의 생각은 '로그인도 결국 서버에 정보를 보내는 거니까 모든 요청에 로그인 정보를 담게 하면 되겠네' 였다. 그리고 역시 이런 생각은 나 이전에 여러 천재들이 방법을 구현해놓는다. 그게 바로 쿠키이다.
쿠키는 http 서버에서 아래와 같이 세팅할 수 있다.
const http = require('http');
http.createServer((req, res) => {
console.log(req.url, req.headers.cookie);
res.writeHead(200, { 'Set-Cookie': 'mycookie=test' });
res.end('Hello Cookie');
})
.listen(8083, () => {
console.log('8083번 포트에서 서버 대기 중입니다!');
});
이렇게 되면 개발자도구 Application -> Cookies에 쿠키 정보가 저장이 된다. 그리고 이렇게 저장된 쿠키는 서버에 요청을 보낼 때 함께 보내지게 된다. 서버는 그걸 보고 '아 얘 000이네 통과시켜' 같은 특정 행동을 하는 것이다.
아래 사진은 티스토리 블로그 글 에디터에 있는 쿠키 정보이다.
사실 나는 쿠키를 잘 몰랐을 때 쿠키는 바로 암호화가 되어서 편하게 서버에서 데이터를 저장해놓고 쓸 수 있는 줄 알았다. 그리고 로컬스토리지와는 다르게 조작도 불가능해서 '이거다..!' 라는 생각을 한적이 있었다.
그래서 프론트를 할 때 쿠키에 이것저것 넣어놓고 신나서 작업했던 기억이 난다. 그런데 보니까 조작도 되고, 암호화도 안되고 그냥 내가 저장한 그대로 쓰이는 것이다? 나는 실망을 감출 수 없었다.
알고보니 쿠키는 여러 옵션도 있고 암호화는 쿠키의 역할이 아니었다.
쿠키 옵션
쿠키 옵션들은 정말 유용한 것들이 많다.
Expires, Max-age(초를 기준으로 한다): 만료 날짜를 설정해줄 수 있다.
Path: 어디서 이 쿠키가 유효한지 설정. '/' -> 여기 아래에 있는 path들은 유효하다.
Secure: https에서만 가능하게 만들어준다.
HttpOnly: 자바스크립트에서 쿠키 조작을 방지하기 위해서 쿠키에 접근할 수 없게 만든다.
사실 쿠키가 이리저리 바뀌는 것은 그 자체로는 큰 문제가 아니다. 문제가 아니라기 보다는 쿠키의 태생이 그래서 수정을 막을 수는 없다. 그런데 이게 서버를 속일 수 있는 경우 큰 문제가 된다.
예를 들어서 서버가 쿠키에 'id=ssunthink'를 심었다고 해보자. 그리고 서버는 이 id를 보고 개인정보들을 쭉 나열해준다. 그런데 어떤 사용자가 'id=kim'으로 바꿨다면? 그대로 kim에 대한 정보가 유출되는 것이다. 걍 조지는 것이다.
그래서 나온 것이 세션이다.
세션
const uniqueInt = Date.now();
session[uniqueInt] = {
name,
expires,
};
res.writeHead(302, {
Location: '/',
'Set-Cookie': `session=${uniqueInt}; Expires=${expires.toGMTString()}; HttpOnly; Path=/`,
});
위의 코드는 세션을 설정하는 코드이다. 첫번째 줄에서 uniqueInt에 지금 시간을 넣어주고 실제로 쿠키에도 해당 값을 보내준다.
이러면 두가지 장점이 있다.
1. 쿠키 이름을 보고 이게 어떤 정보인지 파악이 잘 안된다. 세션이긴 세션인데 이게 로그인에 관한 거야? 권한에 관한 거야? 등등
2. 쿠키가 조작되든 말든 서버는 그냥 '유효하지 않네 쳐내' 라는 반응을 보이면 된다. 그러면 위험이 없다.
사실 이래도 보안 위협은 늘 있기 때문에 조심해야하고, 실제로는 express-session을 많이 쓴다고 하니 이후에 공부하면서 이걸로 연습해보자.
'개발 공부 > nodejs' 카테고리의 다른 글
[섹션 4] npm (0) | 2024.03.10 |
---|---|
[섹션3-3] https, http2, Cluster (0) | 2024.03.10 |
[섹션 3] http 서버 (0) | 2024.03.10 |
[섹션 2-2] 노드 내장 객체, 내장 모듈, 파일 시스템 알아보기 (0) | 2024.02.23 |
[섹션 2-1] 노드 기본 기능 살피기 (0) | 2024.02.22 |