CS공부/네트워크
[네트워크/웹] 쿠키와 세션
이숭간
2021. 7. 17. 00:57
728x90
쿠키와 세션을 알기 이전에 왜 쿠키와 세션이 나왔는지에 대해 이해해야한다. 이를 위해선 HTTP프로토콜의 특징부터 이해해야한다.
HTTP프로토콜의 특징
- 비 연결성 (Connectless)
- 클라이언트가 request를 서버에 보내고, 서버의 response를 보내면 연결이 끊긴다.
- 상태유지 X (Stateless)
- 연결을 끊는순간 서버는 클라이언트의 상태정보를 유지하지 않는다.
쿠키와 세션은 왜 필요한가?
- HTTP프로토콜의 위와같은 특성으로 인해, 클라이언트와 서버간 상태정보를 저장할 필요가 있는경우 (로그인유지 등) 에 사용한다.
- 현재 접속한 사용자가 이전에 접속한 사용자와 같은 사용자인지 아닌지를 알 수 있는 방법이 없다.
- HTTP프로토콜에서 상태를 유지하기위한 기술로 쿠키와 세션을 사용한다. 쿠키와세션의 단점을 보완한 토큰을 이용한 방법도 있다.
쿠키란?
- 클라이언트 로컬에 저장되는 키, 값으로 이루어진 파일
- 이름, 값, 유효시간, 경로 등을 포함한다.
- 클라이언트의 상태정보를 브라우저에 저장하여 참조한다.
1. 쿠키의 구성요소
- 쿠키의 이름(name)
- 쿠키의 값(value)
- 쿠키의 만료시간(Expires)
- 쿠키를 전송할 도메인 이름(Domain)
- 쿠키를 전송할 경로(Path)
- 보안 연결 여부(Secure)
- HttpOnly 여부(HttpOnly)
2. 쿠키의 동작방식
- 웹브라우저가 서버에 요청
- 상태를 유지하고 싶은 값을 쿠키(cookie)로 생성
- 서버가 응답할 때 HTTP 헤더(Set-Cookie)에 쿠키를 포함해서 전송
- Set−Cookie: id=doy
- 전달받은 쿠키는 웹브라우저에서 관리하고 있다가, 다음 요청 때 쿠키를 HTTP 헤더에 넣어서 전송
- cookie: id=doy
- 서버에서는 쿠키 정보를 읽어 이전 상태 정보를 확인한 후 응답
3. 쿠키는 언제 사용하는가?
- 아이디, 비번 (이제는 보안상의 이유로 쿠키에 이런정보는 저장 X)
- 쇼핑몰 장바구니
세션이란?
- 서버에서 저장하는 상태정보
- 일정 시간동안 같은 브라우저로부터 들어오는 요청을 하나의 상태로 보고 그 상태를 유지하는 기술
- 브라우저를 통해 서버로 접속한 시점부터 브라우저를 종료할때까지 유지되는 상태
2. 세션의 동작방식
- 웹브라우저가 서버에 요청
- 서버가 해당 웹브라우저(클라이언트)에 유일한 ID(Session ID)를 부여함
- 서버가 응답할 때 HTTP 헤더(Set-Cookie)에 Session ID를 포함해서 전송쿠키에 Session ID를 JSESSIONID 라는 이름으로 저장
- Set−Cookie: JSESSIONID=xslei13f
- 이후에 웹브라우저를 닫을때까지 요청 때 부여된 Session ID가 담겨있는 쿠키를 HTTP 헤더에 넣어서 전송
- Cookie: JSESSIONID=xslei13f
- 서버는 세션 ID를 확인하고, 해당 세션에 관련된 정보를 확인한 후 응답
3. 세션을 언제 사용하는가?
- 로그인
- 세션도 쿠키를 사용하여 값을 주고받으며 클라이언트 상태정보를 유지하기때문에 세션을 이용한다는것은 결국 쿠키를 이용해야하는것이다.
쿠키와 세션의 차이
- 저장위치
- 쿠키: 클라이언트
- 세션 : 서버
- 보안
- 쿠키: 클라단에 저장되므로 보안에 취약
- 세션 : 쿠키에비해 보안이 좋다. 세션 ID만 저장하고있고 이 값으로 구분해서 서버에서 처리하므로
- 라이프사이클
- 쿠키 : 만료시간에 따라 브라우저를 종료해도 계속 유지될수 있다. (쿠키 만료시간이 남은경우)
- 세션 : 만료시간을 정할 수 있지만 브라우저가 종료되면 만료시간에 상관없이 삭제된다. ( 쿠키가 남아있어도 세션이 종료되었으므로 쿠키에 담긴 세션아이디로 인증불가 )
세션을 사용할때의 단점
- 세션정보를 서버측에 저장하고 있기 때문에 서버의 수평적 확장(스케일아웃)이 불가능하다. (요청1- 서버A, 서버A에 세션정보 저장, 다음요청 - 서버B , 서버B는 세션정보가 없으므로 인증이 안됨)
- 세션서버를 따로 둘경우에 위 문제를 해결가능하지만 세션서버가 죽게되면 모든 세션정보를 잃어버리는 문제가 발생한다.
쿠키와 세션을 보완한 토큰방식
- 토큰방식을 이용하면 HTTP프로토콜의 특성을 유지할 수 있다. (Stateless)
- 토큰을 이용하면 서버에서 상태정보를 몰라도 클라이언트의 요청에 담긴 토큰을 가지고 토큰의 유효성을 검증하고 인증 및 인가를 거치게되고 클라이언트는 권한을 얻게된다.
- 이때 토큰자체에 사용자정보를 담고있는 클레임기반 토큰(JWT)와 단순 문자열로이루어진 토큰으로 나뉘어진다. 후자의경우 DB에 저장하고 비교하는 추가처리가 필요하다.