본문 바로가기

네트워크

[네트워크] 쿠키와 세션에 대해 알아보자.

이 글은 쿠키와 세션을 참고하여 작성된 글입니다.

🧐 쿠키, 세션이 왜 필요할까?

HTTP의 특징 중 하나인 무상 태성은 클라이언트의 요청을 각각의 독립적인 것으로 여기는 특징이 있다. 즉, 서버는 클라이언트의 상태를 저장하지 않기 때문에 클라이언트의 상태에 맞게 자원을 전달하는 것이 불가능하다. 

 

클라이언트의 상태를 저장하지 않는다는 것은 만약 로그인되어 있는 상태에서 새로고침을 했다면, 다시 로그인 절차를 유지하게 된다. 쿠키와 세션은 이러한 단점을 보완하기 위해 생겨났다.

🤔 쿠키란 무엇일까?

쿠키(Cookie)는 클라이언트 로컬에 저장되는 데이터 조각이다. 이는 키(key)와 값(value)으로 구성되어 있다. HTTP 응답 해더에 set-Cookie 속성을 통해 서버에 요청을 보낸 클라이언트에게 제공한다. 쿠키에는 이름, 값, 만료 기간(날짜, 시간), 경로 정보가 들어있다. 클라이언트는 전달받은 쿠키를 저장하고 있다가 서버에게 요청을 보낼 때 참조하여 요청을 보낸다. 이러한 쿠키는 만료 기간 동안 로그인 상태를 유지한다던지, '오늘 더 이상 이 창을 보지 않음'이라는 팝업창 체크의 상태를 서버에게 전달할 수 있게 해 준다.

🤔 세션 쿠키, 지속 쿠키

위에서 소개한 쿠키는 두 가지로 구분할 수 있는데, 만료 기간 즉, 날짜, 시간이 쿠키 정보에 포함되어 있지 않다면, 지속 쿠키로써 항상 저장하라는 의미로 지속 쿠키로 저장된다. 반대로, 만료 기간이 지정되어 있다면, 이는 세션 쿠키로 저장된다.

 

세션 쿠키는 브라우저 메모리에 저장되므로, 브라우저가 종료되면 세션 쿠키 또한 삭제된다. 반대로, 지속 쿠키는 로컬에 파일로 저장되기 때문에 브라우저가 종료되어도 삭제되지 않고 유지된다. 파일로 저장되는 만큼, 보안에 취약하다는 단점이 있다. 그렇기 때문에 아이디, 패스워드와 같은 중요한 정보는 쿠키의 값으로 사용하지 않는다. 

⚙ 쿠키의 생성과 사용 과정

클라이언트가 웹 서버에 접속하게 되면, 서버는 HTTP 응답 해더의 set-Cookie 속성을 통해 클라이언트에게 쿠키를 제공한다.

 

쿠키를 전달받은 클라이언트는 쿠키의 만료기간 설정 여부에 따라 세션 쿠키와 지속 쿠키로 구분하여 브라우저 메모리 혹은 로컬에 파일로 저장한다.

 

클라이언트는 이후 요청을 전달할 때 HTTP 요청 해더의 Cookie 속성을 통해 전달받은 쿠키를 참조하여 요청한다.

 

서버는 클라이언트로부터 전달받은 쿠키를 통해 클라이언트의 상태를 파악하고, 상태에 따른 로직으로 클라이언트에게 응답한다.

🤔 세션이란 무엇일까?

서버의 클라이언트의 상태 정보를 저장하는 기술로 클라이언트와 서버가 연결돼있는 동안 유지되는 데이터를 말한다. 웹 서버에 클라이언트가 접속하면 클라이언트에 대한 정보를 저장하고 서버는 클라이언트에게 고유한 세션 ID를 부여한다. 이는 HTTP 응답 해더의 set-Cookie 속성을 통해 클라이언트에게 전달된다. 

 

⚙ 세션의 생성과 사용 과정

서버에 클라이언트가 요청하면, 필요에 따라 세션에 클라이언트의 상태를 저장한다. 이후 클라이언트를 식별하기 위해 세션 ID를 HTTP 응답 해더의 set-Cookie 속성을 통해 데이터를 담아 클라이언트에게 전달한다.

 

세션 ID를 전달받은 클라이언트는 브라우저 메모리에 세션 ID 정보를 담은 쿠키를 저장한다.

 

클라이언트는 이후 요청부터 서버로부터 전달받은 세션 ID를 HTTP 요청 해더의 Cookie 속성에 담아 요청을 보낸다. 

 

서버는 전달받은 세션 ID를 통해 식별된 클라이언트의 상태를 저장하고 관리한다.

🤷‍♂️ 쿠키와 세션의 차이는 무엇이 있을까?

쿠키는 클라이언트의 브라우저 메모리 혹은 로컬 파일로 저장된다. 반대로 세션은 서버 메모리 혹은 DB에 저장된다. 

 

쿠키는 로컬 파일로 저장될 수 있기 때문에 보안에 취약하다. 반대로 세션은 서버 메모리에 저장되어 있기 때문에 상대적으로 안전하다.

 

쿠키는 브라우저가 종료되어도 지속 쿠키로 저장되어 있다면, 유지된다. 반대로, 세션은 브라우저가 종료되어 클라이언트와 서버의 연결이 종료되면 세션 또한 삭제된다.

 

쿠키는 문자열 타입의 데이터만 담을 수 있다. 반대로 세션은 문자열과 객체 형태의 데이터도 담을 수 있다.

 

쿠키는 클라이언트로부터 서버로 전달되기 때문에 서버에서 HTTP 요청 해더를 바로 참조하여 사용할 수 있어 속도가 비교적 빠르다. 반대로 세션은 클라이언트로부터 전달받은 세션 ID를 통해 서버에 저장된 클라이언트의 정보를 식별해야 하기 때문에 속도가 비교적 느리다.