-

세션(Session)이라는 용어는 다분히 혼돈스럽다. 세션의 정의를 Naver에서 찾아보면 (1) 망 환경에서 사용자 간 또는 컴퓨터 간의 대화를 위한 논리적 연결, (2) 프로세스들 사이에 통신을 수행하기 위해서 메시지 교환을 통해 서로를 인식한 이후부터 통신을 마칠 때까지의 기간으로 설명하고 있다.  http://kin.naver.com/openkr/detail.nhn?docId=24251


논리적인 연결이라.. 이해가 되는가? 뭔가 이해는 되는 것 같은데 정확하게 이해는 안 되지 않는가? 세션의 정확한 의미는
http://en.wikipedia.org/wiki/Session_(computer_science)  를 보면 알 수 있다.  상당히 자세하게 설명되어 있다...
하지만..  이 내용을 모두 읽어서 이해하는 것은 시간도 걸리거니와 쉽지도 않다.  (Wikipedia에서는 OSI 모델 중 Application layer, Session layer, Transport layer으로 구분해서 설명하고 있다. 이중에서 HTTP session과 TCP session(socket 연결)을 이용하여 생각해 보자)

이해하기 쉽게 세션(HTTP Session), 소켓(TCP Socket), 메시지(Message 또는 Packet) 3가지 개념을 가지고 이해해 보자. 이러한 개념을 가지고 이해하지 않으면 HTTP 프로토콜과 관련된 많은 내용들이 잘 이해가 되지 않고 혼란스러울 수 있다. 또한,  소켓에 대해서는 다음 블로그를 참조하자. http://blog.daum.net/ossogood/8435461


<- 논리적 단위 -> <--- 물리적 단위           -----------------------> <-- 메시지의 교환 -->
세션(세션ID)시작 ->
                         클라이언트 소켓 생성 ->

                                                           서버 소켓 연결(Connection)
                                                                                                 -> 요청(Request) 
                                                                                                 <- 응답(Response)
                                                                                                   ....
                                                                                                  -> 요청(Request) 
                                                                                                 <- 응답(Response)
                                                     <-   서버 소켓과 연결 닫힘(Close) 
                       <- 클라이언트 소켓 닫힘
세션종료

위의 그림(?)에서.. 세션은 논리적인 단위라고 표시하였다.  그렇다.. 연결은 되었지만 논리적으로 연결이 되어 있는것이다. 물리적으로 연결이 끊어져 있을 수도 있다는 것이다.  대표적인 예가 웹 브라우저를 이용하여 특정 사이트에 로그인한 경우라고 하겠다.  로그인해서 로그아웃할 때까지 논리적으로 계속 연결이 되어 있는 것이다. (물론 로그인해 놓고 한참동안 아무짓도 하지 않으면 웹서버에서 논리적인 연결을 끊어버릴 수도 있다. 이것이 그 유명한 Session Timeout이다.)

그렇다면 물리적 연결은 누가하는가? 물리적인 연결은 웹 브라우저 프로그램 안의 쓰레드(Thread)가 클라이언트 소켓을 만들어 서버 소켓에 연결을 수행하는 것이다. HTTP가 TCP/IP 기반위에서 이루어지므로 TCP에서 서버의 특정 포트(Port)번호를 통하여 연결을 시도한다. (TCP/IP의 연결을 위한 3-way Handshaking이나 종료를 위한 4-way Handshaking은 다른 책을 참조하기 바란다)

클라이언트 소켓이 서버 소켓과 연결이되면 데이터 패킷(메시지)을 주고 받게 되며, 그때 클라이언트가 서버로 요청(Request)를 보내고, 서버는 요청에 응답(Response)을 하게된다.

그런데...  만약 한 번의 Request와 Response가 수행되고 난 이후에 바로 클라이언트 소켓이 닫힌다면(그래서 해당 쓰레드가 종료된다면),  세션이 종료되지 않은 상태에서 다음 요청(Request)을 처리하기 위해서는 새로운 쓰레드를 이용하여 소켓을 생성하고 다시 연결작업을 수행해야 한다.  HTTP/1.0 프로토콜은 이러한 작업이 기본동작이었다. 

이렇게 사용자가 지속적으로 무엇인가 요청할 때마다 쓰레드가 생성되어 소켓을 연결/종료하기를 반복해야 하므로 비효율적이다. 그래서 HTTP/1.1에서는 연속된 요청과 응답을 위하여 소켓을 재사용할 수 있게 하였다.  이것이 바로 keep-alive이다.

HTTP/1.0 프로토콜에 따라, 새로운 쓰레드에 의해 생성된 소켓 연결을 통하여, 서버로 요청메시지를 보냈을 때 같은 세션이라는 것을 어떻게 서버가 알 수 있을까? 이것은 세션이 성립되면 서버가 클라이언트 쪽으로 세션 ID(Session ID)를 HTTP cookie를 통하여 전송하고 클라이언트 PC에 저장되기 때문이다.  Cookie에 들어있는 Session ID를 클라이언트가 요청과 같이 보내기 때문에 서버가 같은 세션에서 보내온 요청이라는 것을 알게 된다.

http://en.wikipedia.org/wiki/Http


'웹( Web ) > Web Browser' 카테고리의 다른 글

header - user agant 란  (0) 2016.01.11
HTTP header - referer(레퍼러) 란  (0) 2016.01.10
세션 및 장점 과 쿠키의 차이점.  (0) 2016.01.10
cookie(쿠키) 란 무엇인가  (0) 2016.01.10
[JSP] Servlet 이란  (0) 2016.01.10

다른 카테고리의 글 목록

웹( Web )/Web Browser 카테고리의 포스트를 톺아봅니다