본문 바로가기
컴퓨터공학

[네트워크] 쿠키와 세션

by taurusx 2023. 5. 14.

쿠키와 세션

HTTP는 Stateless한 프로토콜로, 각 HTTP 요청(Request)은 서로 독립적으로 처리된다. 즉, HTTP는 요청을 처리하고 나면 클라이언트와의 연결을 끊고 다음 요청이 들어오면 새로운 연결을 맺는다. 따라서 이전 요청과의 연결 정보는 유지되지 않는다. 이와 같은 Stateless 특징은 서버 측에서 자원(Resource)을 보다 효율적으로 관리할 수 있게 해주는 장점이 있지만, 사용자의 상태 정보를 유지하기 어렵게 만드는 단점이 있다.
 

(출처) https://raonctf.com/essential/study/web/cookie_connection

 
 
쿠키와 세션은 웹 서비스에서 상태 정보를 유지하기 위해 사용되는 기술이다. 클라이언트와 서버는 쿠키와 세션을 교환함으로써 Stateless한 HTTP 프로토콜 상에서 상태 정보를 유지할 수 있다.
 
 

1. 쿠키(Cookie)

쿠키는 클라이언트 측에 저장되는 작은 데이터 조각으로, 세션 ID, 사용자 지정 설정 및 선호 사항 등을 저장하는 데 사용된다. 웹 사이트를 방문할 때 서버가 클라이언트에게 쿠키를 보내면 클라이언트는 서버로부터 받은 쿠키를 저장하고, 이후 동일한 서버에 요청을 보낼 때마다 해당 쿠키를 함께 전송한다. 이처럼 쿠키는 클라이언트 측에서 관리되기 때문에 보안 상 문제가 발생할 수 있으므로, 중요한 정보는 쿠키에 저장하지 않는 것이 좋다.
 
쿠키는 대표적으로 영속 쿠키와 세션 쿠키가 있다.

  • 영속 쿠키(Persistent Cookie) : 클라이언트 PC에 파일 형태로 저장되는 쿠키로, 사용자가 직접 쿠키 만료 시간을 설정할 수 있다.
  • 세션 쿠키(Session Cookie) : 브라우저 메모리에 저장되는 쿠키로, 만료 시간을 설정하지 않은 경우 브라우저가 닫힐 때 삭제된다.

 

쿠키 동작 과정

(출처) https://raonctf.com/essential/study/web/cookie_connection

 

1. 클라이언트에서 서버로 HTTP 요청을 보낸다.

2. 서버는 요청 처리 결과와 함께 사용자 관련 정보를 담은 쿠키를 클라이언트에게 응답한다. 이때 쿠키는 HTTP 응답 메세지의 Set-Cookie 헤더에 담기며, 이름과 값 쌍으로 구성된다.

Set-Cookie: <cookie-name>=<cookie-value>

3. 클라이언트는 전송받은 쿠키를 로컬저장소에 저장한다.

4. 이후 클라이언트는 동일한 서버에게 요청을 보낼 때 쿠키를 함께 전송한다. 이때 쿠키는 HTTP 요청 메세지의 Cookie 헤더에 담긴다.

Cookie: <cookie-name>=<cookie-value>

5. 서버는 전송받은 쿠키 정보를 바탕으로 작업 수행 후 클라이언트에게 응답한다.

 
 

2. 세션(Session)

세션은 서버 측에서 관리되는 상태 정보로, 클라이언트가 서버에 접속하면 서버는 세션 ID를 생성하여 클라이언트에게 전송한다. 클라이언트는 해당 세션 ID를 사용하여 서버의 세션 데이터에 접근(Access)할 수 있다. 일반적으로 세션 데이터는 서버의 메모리나 디스크 또는 데이터베이스에 저장되기 때문에 보안적인 측면에서 더 안전하다.

 

이처럼 세션은 클라이언트의 세션 쿠키를 이용해서 동작하기 때문에, 브러우저에서 쿠키를 비활성화로 설정하면 쿠키 기능 뿐 아니라 세션 기능도 사용할 수 없게 된다.

 

세션 동작 과정

1. 클라이언트에서 서버로 HTTP 요청을 보낸다.

2. 서버는 클라이언트에 대한 세션 객체를 생성하고, 요청 처리 결과와 함께 세션 객체를 식별할 수 있는 세션 ID를 세션 쿠키에 담아 클라이언트에게 전송한다. 이때 쿠키의 이름은 JSESSIONID이고 값은 세션 ID가 된다.

Set-Cookie: JSESSIONID=<session-id>; Path=/

3. 클라이언트는 전송받은 세션 쿠키를 브라우저 메모리에 저장한다.

4. 클라이언트는 다음 요청 시 해당 쿠키를 함께 전송한다.

Cookie: JSESSIONID=<session-id>

5. 서버는 세션 ID를 사용하여 클라이언트의 세션 데이터를 식별하고 접근한다.

6. 이후 클라이언트가 브라우저를 종료하거나 세션이 만료되면, 서버는 세션 데이터를 삭제한다.

 
 

3. 쿠키와 세션의 보안 문제

HTTP 쿠키와 세션은 보안 문제가 발생할 수 있다. 예를 들어, 세션 쿠키를 훔친 해커는 세션 ID를 사용하여 서버에 로그인할 수 있거나 다른 보호된 페이지에 접근할 수 있다. 따라서 쿠키와 세션을 사용할 때는 보안성을 고려하여 적절한 방법으로 사용하는 것이 중요하다.
 

1) SSL(HTTPS) 사용

SSL을 사용하여 쿠키와 세션에 대한 보안성을 강화할 수 있다. SSL은 중간자 공격을 방지하고, 데이터 변조 및 데이터 탈취와 같은 공격을 방어할 수 있다.
 

2) 쿠키와 세션 만료 시간 설정

쿠키와 세션의 만료 시간을 설정하여 브라우저에서 세션 ID를 오랫동안 보관하지 않도록 해야 한다. 만료 시간을 짧게 설정하면 공격자가 세션 ID를 훔쳐갔을 때 그 세션을 오랫동안 사용하지 못하도록 제한할 수 있다.
 

3) 세션 ID의 무작위성과 복잡성 유지

세션 ID는 무작위성과 복잡성이 있어야 한다. 공격자가 세션 ID를 추측하기 어렵도록 임의의 긴 문자열로 구성된 세션 ID를 사용해야 한다.
 

4) 서버 측에서 세션 데이터를 안전하게 저장

세션 데이터를 서버 측에서 안전하게 저장해야 한다. 즉, 세션 데이터를 클라이언트에서 직접 접근할 수 없도록 서버의 메모리나 암호화된 데이터베이스에 저장해야 한다.
 

5) 쿠키와 세션을 필요한 경우에만 사용

쿠키와 세션은 개인 정보와 보안 관련 정보를 가지기 때문에, 반드시 필요한 경우에만 사용해야 한다. 쿠키와 세션을 사용하는 것이 반드시 필요하지 않은 경우 다른 방법을 사용하는 것이 좋다.
 
 

Q. 자바의 HttpSession은 여러 사용자의 세션을 어떻게 구분하고 관리하는가?

HttpSession은 웹 애플리케이션에서 세션을 관리하는 객체로, 각 클라이언트에 대해 HttpSession 객체가 생성되며 클라이언트와 서버 간의 통신이 지속되는 동안 존재한다. HttpSession은 각 클라이언트의 세션을 구분하기 위해 세션ID를 사용한다. 클라이언트가 서버에 최초로 요청을 보내면 서버는 해당 클라이언트에 대해 고유한 세션 ID를 생성하고, 이를 세션 쿠키에 담아 클라이언트에게 응답한다. 이후 클라이언트가 서버로 요청을 보낼 때 세션 ID를 함께 전송하면, 서버는 이를 사용해 클라이언트의 HttpSession 객체를 식별한다. 서버는 HttpSession 객체를 사용해 클라이언트의 상태를 추적하고 유지할 수 있다.
즉, 각 클라이언트에 대한 HttpSession 객체는 서버 측에서 유지되고, 각각의 HttpSession 객체는 고유한 세션 ID를 부여받아 서로 구분된다. 이를 통해 서버는 여러 사용자의 세션을 구분하고 관리할 수 있다.
 
 

Q. HttpSession 객체는 서버의 메모리에 저장되는가?

HttpSession 객체는 서버의 힙(Heap) 메모리에 저장된다. HttpSession 객체는 일반적으로 매우 작은 크기이기 때문에 서버 메모리 부하를 크게 일으키지 않는다. 그러나 세션 데이터가 많아지면 서버 메모리 부하가 증가할 수 있는데, 이때는 데이터베이스나 파일 시스템과 같은 저장소에 세션 데이터를 저장하여 서버의 메모리 부하를 줄일 수 있다. 그러나 이와 같은 방법은 데이터베이스나 파일 시스템에 접근(Access)하는 비용이 더 커서 성능 저하가 발생할 수 있다.
 
 
(참고)
- 도서 <자바 웹을 다루는 기술>
 
 

댓글