세션 (컴퓨터 과학)

컴퓨터 과학 및 특히 컴퓨터 망에서 **세션**(session)은 시간으로 제한된 양방향 링크이며, 두 개 이상의 통신 장치 또는 끝점(컴퓨터, 자동화 시스템 또는 활성 사용자(로그인 세션 참조)) 간의 대화식 표현 및 정보 교환을 가능하게 하는 TCP/IP 프로토콜의 실제적인 (상대적으로 높은) 계층이다. 세션은 특정 시점에 설정되고, 나중에 해제되어 종료된다. 설정된 통신 세션은 각 방향으로 하나 이상의 메시지를 포함할 수 있다. 세션은 일반적으로 상태 유지되며, 이는 통신 당사자 중 적어도 하나가 현재 상태 정보를 유지하고 세션 이력을 저장하여 통신할 수 있어야 한다는 의미이다. 이는 독립적인 요청-응답으로 구성된 통신인 무상태 통신과는 대조적이다.

설정된 세션은 연결 지향 통신을 수행하기 위한 기본 요구 사항이다. 세션은 또한 비연결형 통신 모드에서 전송하기 위한 기본 단계이다. 그러나 단방향 전송은 세션을 정의하지 않는다.

**통신 전송**은 OSI 모형의 응용 계층, 세션 계층 또는 전송 계층의 프로토콜 및 서비스의 일부로 구현될 수 있다.
* 응용 계층 예시:
** HTTP 세션, 개별 방문자와 정보를 연결할 수 있도록 함
** 텔넷 원격 로그인 세션
* 세션 계층 예시:
** 세션 개시 프로토콜(SIP) 기반 인터넷 전화 통화
* 전송 계층 예시:
** TCP 세션은 TCP 가상 회선, TCP 연결 또는 설정된 TCP 소켓과 동의어이다.

공식적인 세션 계층을 구현하지 않는 전송 프로토콜(예: UDP) 또는 응용 계층의 세션이 일반적으로 매우 짧은 수명인 경우(예: HTTP)에는 교환되는 데이터에 정의된 메서드를 사용하여 상위 수준 프로그램에서 세션을 유지 관리한다. 예를 들어, 브라우저와 원격 호스트 간의 HTTP 교환에는 고유한 세션 ID, 사용자 기본 설정 또는 인증 수준과 같은 상태를 식별하는 HTTP 쿠키가 포함될 수 있다.

HTTP/1.0은 하나의 웹/HTTP 세션 동안 단일 요청 및 응답만 허용하는 것으로 생각되었다. 프로토콜 버전 HTTP/1.1은 공용 게이트웨이 인터페이스(CGI)를 완성하여 웹 세션 유지 관리를 더 쉽게 하고 HTTP 쿠키 및 파일 업로드를 지원함으로써 이를 개선했다.

대부분의 클라이언트-서버 세션은 전송 계층에 의해 유지 관리된다. 즉, 단일 세션에 대한 단일 연결이다. 그러나 웹/HTTP 세션의 각 트랜잭션 단계는 별도의 연결을 생성한다. 단계 간의 세션 연속성을 유지하려면 세션 ID가 필요하다. 세션 ID는 동적 웹페이지의  또는  링크 내에 내장되어 CGI로 다시 전달된다. CGI는 세션 ID를 사용하여 트랜잭션 단계 간의 세션 연속성을 보장한다. 단계별 연결의 한 가지 장점은 낮은 대역폭(모뎀) 연결에서 잘 작동한다는 것이다.

## 소프트웨어 구현
TCP 세션은 일반적으로 자식 프로세스 및 멀티스레딩을 사용하여 소프트웨어로 구현되며, 컴퓨터가 세션을 설정하거나 세션에 참여할 때 새 프로세스 또는 스레드가 생성된다. HTTP 세션은 일반적으로 세션당 하나의 스레드를 사용하는 것이 아니라 각 세션의 상태에 대한 정보를 가진 데이터베이스를 통해 구현된다. 여러 프로세스 또는 스레드의 장점은 각 스레드가 자체 이력과 캡슐화된 변수를 가진 인스턴스이므로 소프트웨어의 복잡성이 완화된다는 것이다. 단점은 시스템 리소스 측면에서 오버헤드가 크고 시스템이 다시 시작되면 세션이 중단될 수 있다는 것이다.

클라이언트가 서버 클러스터의 모든 서버에 연결할 수 있는 경우, 서버가 세션 상태를 유지해야 할 때 일관성을 유지하는 데 특별한 문제가 발생한다. 클라이언트는 세션 기간 동안 동일한 서버로 연결되도록 지시되거나, 서버는 공유 파일 시스템 또는 데이터베이스를 통해 서버 측 세션 정보를 전송해야 한다. 그렇지 않으면 클라이언트가 세션을 시작한 서버와 다른 서버에 다시 연결할 수 있으며, 이로 인해 새 서버가 이전 서버의 저장된 상태에 액세스할 수 없을 때 문제가 발생한다.

## 서버 측 웹 세션

서버 측 세션은 편리하고 효율적이지만, 로드 밸런싱/고가용성 시스템과 함께 처리하기 어려울 수 있으며, 저장 공간이 없는 일부 임베디드 시스템에서는 전혀 사용할 수 없다. 로드 밸런싱 문제는 공유 저장 공간을 사용하거나 클러스터의 각 클라이언트와 단일 서버 간에 강제 피어링을 적용하여 해결할 수 있지만, 이는 시스템 효율성과 로드 분배를 저해할 수 있다.

대용량 저장 공간이 없는 시스템에서 서버 측 세션을 사용하는 한 가지 방법은 세션 데이터 저장용 RAM의 일부를 예약하는 것이다. 이 방법은 제한된 수의 클라이언트를 가진 서버(예: 한 번에 하나 이상의 클라이언트에 대한 액세스가 드물거나 허용되지 않는 라우터 또는 액세스 포인트)에 적용할 수 있다.

## 클라이언트 측 웹 세션

클라이언트 측 세션은 쿠키와 암호화 기술을 사용하여 서버에 많은 데이터를 저장하지 않고도 상태를 유지한다. 동적 웹페이지를 제공할 때 서버는 현재 상태 데이터를 쿠키 형태로 클라이언트(웹 브라우저)로 보낸다. 클라이언트는 쿠키를 메모리나 디스크에 저장한다. 클라이언트는 각 후속 요청과 함께 쿠키를 서버로 다시 보내고, 서버는 이 데이터를 사용하여 해당 특정 클라이언트에 대한 애플리케이션의 상태를 "기억"하고 적절한 응답을 생성한다.

이 메커니즘은 일부 상황에서 잘 작동할 수 있지만, 클라이언트에 저장된 데이터는 사용자 또는 클라이언트 컴퓨터에 액세스할 수 있는 소프트웨어에 의한 변조에 취약하다. 기밀성과 무결성이 요구되는 클라이언트 측 세션을 사용하려면 다음이 보장되어야 한다.
# 기밀성: 서버 외에는 세션 데이터를 해석할 수 없어야 한다.
# 데이터 무결성: 서버 외에는 세션 데이터를 조작할 수 없어야 한다(우발적이거나 악의적으로).
# 신뢰성: 서버 외에는 유효한 세션을 시작할 수 없어야 한다.

이를 달성하기 위해 서버는 세션 데이터를 클라이언트로 보내기 전에 암호화해야 하며, 다른 당사자에 의한 이러한 정보의 수정은 암호화 수단을 통해 방지되어야 한다.

각 요청과 함께 상태를 주고받는 것은 쿠키 크기가 작을 때만 실용적이다. 본질적으로 클라이언트 측 세션은 서버 디스크 공간을 각 웹 요청에 필요한 추가 대역폭과 교환한다. 또한 웹 브라우저는 웹 사이트에서 저장할 수 있는 쿠키의 수와 크기를 제한한다. 효율성을 개선하고 더 많은 세션 데이터를 허용하기 위해 서버는 쿠키를 생성하기 전에 데이터를 압축하고, 클라이언트가 쿠키를 반환할 때 나중에 압축을 해제할 수 있다.

## HTTP 세션 토큰

세션 토큰은 현재 상호작용 세션을 식별하기 위해 서버에서 클라이언트로 생성되어 전송되는 고유 식별자이다. 클라이언트는 일반적으로 HTTP 쿠키로 토큰을 저장하고 보내거나 GET 또는 POST 쿼리의 매개변수로 보낸다. 세션 토큰을 사용하는 이유는 클라이언트가 식별자만 처리하면 되기 때문이다. 모든 세션 데이터는 해당 식별자에 연결되어 서버(일반적으로 데이터베이스에 저장되며, 클라이언트는 직접 액세스할 수 없음)에 저장된다. 일부 프로그래밍 언어가 HTTP 쿠키의 이름으로 사용하는 예로는 JSESSIONID (JSP), PHPSESSID (PHP), CGISESSID (CGI), ASPSESSIONID (ASP) 등이 있다.

## 세션 관리

인간-컴퓨터 상호 작용에서 **세션 관리**는 컴퓨터 시스템과의 상호 작용 세션 전반에 걸쳐 사용자의 활동을 추적하는 프로세스이다.

데스크톱 환경의 일반적인 세션 관리 작업에는 사용자가 로그아웃했다가 나중에 다시 로그인할 때 동일한 상태를 복원할 수 있도록 어떤 애플리케이션이 열려 있고 각 애플리케이션이 어떤 문서를 열었는지 추적하는 것이 포함된다. 웹사이트의 경우 세션 관리는 세션이 만료된 경우(즉, 사용자 활동 없이 특정 시간 제한이 경과한 경우) 사용자에게 다시 로그인하도록 요구하는 것을 포함할 수 있다. 또한 HTTP 요청 간에 서버 측에 정보를 저장하는 데 사용된다.

### 데스크톱 세션 관리

데스크톱 세션 관리자는 데스크톱 세션을 저장하고 복원할 수 있는 프로그램이다. 데스크톱 세션은 현재 실행 중인 모든 창과 해당 창의 현재 콘텐츠이다. 리눅스 기반 시스템의 세션 관리는 X 세션 관리자가 제공한다. 마이크로소프트 윈도우 시스템에서는 세션 관리자가 Session Manager Subsystem (smss.exe)에 의해 제공되며, 사용자 세션 기능은 트윈스플레이와 같은 타사 애플리케이션에 의해 확장될 수 있다.

### 브라우저 세션 관리

세션 관리는 사용자가 열린 모든 페이지와 설정을 저장하고 나중에 또는 다른 컴퓨터에서 복원할 수 있는 웹 브라우저에서 특히 유용하다(데이터 이동 참조).

시스템 또는 애플리케이션 충돌에서 복구하는 데 도움이 되도록 페이지와 설정은 다음 실행 시에도 복원될 수 있다. 구글 크롬, 모질라 파이어폭스, 인터넷 익스플로러, 옴니웹 및 오페라는 세션 관리를 지원하는 웹 브라우저의 예이다. 세션 관리는 종종 쿠키를 적용하여 관리된다.

### 웹 서버 세션 관리

하이퍼텍스트 전송 프로토콜(HTTP)은 무상태 프로토콜이다. 세션 관리는 웹 개발자가 무상태 HTTP 프로토콜이 세션 상태를 지원하도록 하는 데 사용하는 기술이다. 예를 들어, 사용자가 웹 서버에 인증되면 사용자의 다음 HTTP 요청(GET 또는 POST)으로 인해 웹 서버가 사용자 계정 및 비밀번호를 다시 요청해서는 안 된다. 이를 달성하는 데 사용되는 방법에 대한 논의는 HTTP 쿠키 및 세션 ID를 참조하라.

여러 웹 서버가 세션 상태에 대한 지식을 공유해야 하는 상황(일반적으로 컴퓨터 클러스터 환경에서)에서는 웹 서버 소프트웨어를 실행하는 클러스터 노드 간에 세션 정보가 공유되어야 한다. 클러스터의 노드 간에 세션 상태를 공유하는 방법에는 멤버 노드에 세션 정보를 멀티캐스팅하는 방법(JGroups 참조), 분산 공유 메모리 또는 메모리 가상화를 사용하여 파트너 노드와 세션 정보를 공유하는 방법, 네트워크 소켓을 사용하여 노드 간에 세션 정보를 공유하는 방법, 분산 파일 시스템 또는 글로벌 파일 시스템과 같은 공유 파일 시스템에 세션 정보를 저장하는 방법, 또는 클러스터 외부의 데이터베이스에 세션 정보를 저장하는 방법이 있다.

세션 정보가 트랜잭션의 부인봉쇄에 필요하지 않고 규정 준수 감사 대상 데이터(예를 들어 미국에서는 건강 보험 이동 및 책임에 관한 법률 및 사베인스 옥슬리법 참조)를 포함하지 않는 일시적이고 휘발성 데이터로 간주되는 경우, 세션 정보를 저장하는 모든 방법을 사용할 수 있다. 그러나 세션 정보가 감사 규정 준수 대상인 경우, 세션 저장, 복제 및 클러스터링에 사용되는 방법을 고려해야 한다.

서비스 지향 아키텍처에서 XML 메시지로 구성된 단순 객체 접근 프로토콜 또는 SOAP 메시지는 소비자 애플리케이션에서 웹 서버가 세션을 생성하도록 하는 데 사용될 수 있다.

### SMS를 통한 세션 관리

HTTP와 마찬가지로 SMS도 무상태 프로토콜이다. 1999년에 SMS가 경쟁 네트워크 간에 상호 운용이 가능해지면서 문자 메시지가 보편적인 글로벌 통신 형태로 부상하기 시작하자 다양한 기업들이 SMS 채널을 상업적 목적으로 사용하는 데 관심을 갖게 되었다. 초기 서비스는 단방향 통신에 불과했기 때문에 세션 관리가 필요하지 않았다(예를 들어, 2000년 핀란드에서 SMS를 통해 최초의 모바일 뉴스 서비스가 제공되었다). 오늘날 이러한 애플리케이션은 애플리케이션-투-피어(A2P) 메시징으로 불리며 피어-투-피어(P2P) 메시징과 구별된다. 대화형 기업 애플리케이션의 개발에는 세션 관리가 필요했지만, SMS는 GSM 표준에 의해 정의된 무상태 프로토콜이기 때문에 초기 구현은 최종 사용자가 명령과 서비스 식별자를 수동으로 입력하는 방식으로 클라이언트 측에서 제어되었다.

## 같이 보기
* HTTPS

## 각주

## 외부 링크
*  Understanding Sessions in PHP
*  Session tracking methods
*  Sessions by Doug Lea

분류:네트워크 프로토콜
분류:월드 와이드 웹
분류:HTTP