session / cookie 왜 사용하나요?
- HTTP(Hypertext Transfer Protocol) 특성 때문이다.
1. 비연결지향(Connectionless)
request(요청) 를 보내면 서버는 작업 후 클라이언트에게 response(응답) 를 보내고 연결을 끊는다.
연결을 끊어버리기 때문에 클라이언트에 상태를 알 수가 없다.
2. 상태정보유지안함(Stateless)
서버와 클라이언트에 통신이 끝나고 연결을 끊어버리는 순간 어떠한 상태도 유지하지 않는다.
- 위 두가지를 보안하고자 session / cookie 과 등장
session
- session(세션)은 클라이언트와 서버간 상태를 유지하기 위한 기술
- 일정시간동안 동일한 웹 브라우저(크롬, 사파리 등) 단위로 생성되고 브라우저 종료시 소멸
- session(세션) 정보는 서버에 저장이 된다 (서버 메모리 사용)
- 서버자원을 사용하기 때문에, session(세션) 이 많아질수록 부하 또는 자원이 부족해질수 있다
1. 클라이언트가 서버로 request(요청)
2. 서버는 session id 가 있는지 없는지 확인하여, 없으면 session id 를 발급하여 response(응답) -> cookie 를 이용
3. 클라이언트에서 서버로 request(요청) -> 이때 session id 가 쿠키에 저장이 되어있으므로 request header 에 쿠키 정보를 같이 보낸다
4. 서버는 전달받은 쿠키에서 session id 를 통해 구별
5. 서버에서 session 을 사용 또는 갱신 후, 새로운 session id 를 발급하여 response(응답)
cookie
- cookie(쿠키)는 클라이언트와 서버간 상태를 유지하기 위한 기술
- cookie(쿠키)는 정보를 클라이언트에 저장하며, key : value 형식을 가지고 있다
- 쿠키는 4kb 제한된 용량을 가지고 있으며, 최대 생성할수 있는 개수도 존재(브라우저별로 상이)
- 브라우저 종료시 삭제되는 session cookie(세션 쿠키) 와 우리가 일반적으로 사용하는 persitence cookie(지속성 쿠키)가 있다
- 일반적으로 쿠키는 일정시간 정보를 유지(max-age, expires)
- Response Header 의 Set-Cookie 속성을 사용하면 클라이언트에 쿠키를 만들 수 있다.
만들어진 쿠키는 사용자가 요청하지 않아도 브라우저가 매번 Request Header에 넣어서 서버에 전송
Set-Cookie: 키=값; 옵션들
- expires: 쿠키 만료 날짜를 알려줄 수 있습니다.
- max-age: 쿠키 수명을 알려줄 수 있습니다. expires는 무시됩니다.
- secure: https에서만 쿠키가 전송됩니다.
- httponly: 자바스크립트에서 쿠키에 접근할 수 없습니다. XSS 요청을 막으려면 활성화해두는 것이 좋습니다.(클라이언트에서 쿠키에 접근 불가능)
- domain: 도메인을 적어주면 도메인이 일치하는 요청에서만 쿠키가 전송됩니다. 가끔 도메인이 다른 쿠키들이 있는데, 이런 쿠키들은 써드 파티 쿠키로 여러분을 추적하고 있는 쿠키입니다. 구글이나 페이스북같은 곳이 써드 파티 쿠키를 적극적으로 사용합니다.
- path: 패스를 적어주면 이 패스와 일치하는 요청 요청에서만 쿠키가 전송됩니다.
session 과 cookie 비교
- 정보 저장위치가 다르다(서버 vs 클라이언트)
- 속도 -> 쿠키는 빠르고, 세션은 느리다
- 보안 -> 쿠키는 위험(클라이언트에 정보가 있음) / 세션은 안전(서버에 정보가 있음)
- 생명주기 -> 세션은 브라우저가 종료되면 사라지고, 쿠키는 설정한 수명에 따라 사라진다.
- 단, session id 는 쿠키에 저장이 되기 때문에 session id 를 가로채 변조해서 사용할 수 있다.