728x90
쿠키와 세션을 사용하는 이유
HTTP는 기본적으로 무상태(Stateless) 프로토콜이다. 이말은 즉슨 클라이언트와 서버가 요청을 주고 받으면 연결이 끊어지게 되고 클라이언트가 다시 요청시 서버는 이전요청을 기억하지 못한다. 클라이언트와 서버는 서로 상태를 유지하지 않는다는 의미이다.
하지만 실제로는 상태를 유지해야 하는 경우가 많다.
예시로 로그인한 사용자만 접속할 수 있는 페이지가 있다고 가정하면 해당 페이지에 매번 접근할때마다 로그인을 다시 해야한다.
이렇게 Stateful한 경우를 대처하기 위해서 쿠키와 세션을 이용한다.
쿠키(Cookie)
특징 및 저장방식
- key, value, expires(만료일), path 정보로 구성
- 클라이언트가 서버에서 받은 쿠키를 로컬(브라우저)에 저장하고, HTTP 요청시 서버로 전달
- 쿠키 정보는 항상 서버에 전송되기에 네트워크 트래픽을 추가 유발 -> 최소한의 정보만 사용(세션 ID, 인증토큰)
- 보안에 민감한 정보는 탈취당할 가능성이 있기 때문에 쿠키로 사용하지 않는다(ex. 주민번호, 신용카드 번호)
- 하나의 쿠키는 4KB, 하나의 도메인당 20개의 쿠키, 클라이언트 브라우저에 총 300개의 쿠키를 저장할 수 있다.
생명주기
- Set-Cookie: expires=Sat, 26-Dec-2020 04:39:21 GMT -> 만료일이 되면 쿠키 삭제
- Set-Cookie: max-age=3600 -> 3600초후 삭제, 0이나 음수를 지정하면 쿠키 삭제
- 세션 쿠키 : 만료날짜를 생략하면 브라우저 종료시까지만 유지
- 영속 쿠키 : 만료날짜를 입력하면 해당 날짜까지 유지(expires, max-age로 명시된 만료일자까지)
세션(Session)
동작방식
- 클라이언트 요청시 서버측에서 세션 데이터를 메모리에 저장하고 클라이언트 별 고유 세션 ID를 쿠키에 담아 저장
- 클라이언트는 서버에 요청시 쿠키의 세션 ID를 같이 서버에 전달해서 요청
- 서버는 세션 ID를 전달받아서 세션ID로 세션에 있는 클라이언트 정보를 가져와서 사용 및 클라이언트에 응답
특징
- 각 클라이언트에게 고유 ID 부여
- 브라우저를 닫으면 세션이 삭제됨
- 쿠키는 로컬에 저장되기 때문에 탈취될 가능성이 있어 보안적인 면에서 취약하지만 세션은 쿠키를 이용하여 sessionId만 저장하고 sessionId로 구분하기 때문에 비교적 보안이 좋음
- 사용자가 많아질수록 서버에 메모리를 많이 차지해 부하를 줄 수 있음
쿠키와 세션의 차이점
Cookie | Session | |
저장위치 | 브라우저(로컬) | 서버 |
보안 | 취약 | 안전 |
생명주기 | 만료시점이 지나지 않으면 삭제 되지 않음 | 브라우저 종료시 삭제 |
속도 | 빠름 | 느림 |
저장형식 | 텍스트 | 객체 |
- 저장위치 및 자원 사용 유무 : 쿠키는 브라우저(로컬)에 사용자 정보를 저장하기때문에 서버의 자원을 사용하지 않으며 세션은 서버의 자원을 사용한다.
- 보안 및 속도 : 보안적인 측면에서는 sessionId로 구분하여 사용하는 서버가 더 우수하지만 속도적인 측면에서는 별도의 서버 처리가 없는 쿠키가 더 우수하다.
- 생명주기 : 쿠키는 만료시간을 정하지 않으면 삭제되지 않지만 세션은 브라우저 종료시 삭제된다.