세션은 서버측에서 보관하는 자료는 맞지만 서버쪽에서는 요청들어오는 클라이언트가 어떤클라이언트인지를 식별하기 위해 쿠키로 세션키를 발급하는 방법이 일반적입니다.(물론 다른 방법도 있긴합니다만)
때문에 쿠키를 유지하는것이 서버측에 보관된 세션과 연결되는 통로인것은 맞습니다.
세션키는 일반적으로 서버에 처음 접속할때(제출할 세션 키가 없을때) 서버에서 발급해주는것을 접속 종료시까지 유지 해야 하며,
쿠키만 있다고 세션이 연결된 것이 아니라 서버측의 세션 로그인 프로세스를 수행하여 서버측 세션에 정식 사용자로 등록 되도록 해야 합니다.
서버측 세션정보도 만료 시간이 있고(서버측 설정) 발급되는 쿠기도 만료 시간이 있지만 이미 서버측에서 만료된 세션의 세션키를 쿠키로 제출하였다 하여도 서버는 무시할 분 부가되는 부하는 없습니다.
문제는 서버에서 발급하는 세션키가 어느 쿠키 이름으로 발급될지는 서버 제품에 따라 다양하기 때문에 서버에서 발급되는 쿠키는 모두 보관 하여야 하며, 보관된 쿠키를 매 요청시 제출해 주어야 합니다.
또. 서버에서 발급하는 쿠키에는 서버가 설정한 유효 기간과 범위가 있으므로, 이 기간과 범위에 마추에 제출 여부도 결정해 주어야 하는데. 이런 복잡한 작업을 직접 구현하시기는 번거롭고 귀찮은 작업일 것입니다.
이런 작업들을 처리 해주는 라이브 러리가 HttpClient 라이브러리( http://hc.apache.org/httpclient-3.x ) 인데 작성하신 소스를 보면 사용하여 작업을 하신것 같은데, 세션을 위한 쿠키 처리를 직접 하실 필요는 없고 해당 서버의 로그인 페이지를 먼저 호출하여 HttpClient 가 정상적인 세션키를 수집하게만 하면 별다른 작업은 필요 없습니다.
(단 HttpClient 인스턴스에 종속되니 세션 유지 기단동안은 새로운 인스턴스가 아닌 하나의 인스턴스를 이용하도록 하십시오.)
HttpClient 프로젝트 홈페이지에서 제공하는 FormLoginDemo 샘플 코드를 보시기 바랍니다.
http://svn.apache.org/viewvc/httpcomponents/oac.hc3x/trunk/src/examples/FormLoginDemo.java?view=markup
해당 소스에 쿠키를 얻는 코드가 있지만 단순히 HttpClient가 수집한 쿠키가 로그인전과 로그인후 이렇게 바뀌었다라는걸 표시하기 위한 디버깅용 코드입니다.
//지나다가
세션..이란것은 로그인 프로세스와는 상관이 없습니다..
흔히 로그인 프로세스에 세션이 많이 적용 되어서 그렇죠..
왜냐면 로그인 프로세스에서 입력한 아이디를 항상 가지고 댕기면서 작업을 해야 하고..
그런 작업을 하는데 있어 가장 좋은 방법이 세션이기땜에 그런것일뿐입니다..
세션..은 접속입니다..
내가 걍 신문사 메인페이지를 보더라도 세션은 생성이 됩니다..
무슨 로그인 프로세스를 태워야 세션 아이디가 발급되는 그런게 아닙니다..
세션은 웹서버입장에서 볼땐 웹서버에 접근한 사용자들에게 할당된 일종의 메모리 공간이고..
이 공간에 개개의 ID를 부여한 것들이 세션 아이디입니다..
내가 해당 도메인에 접속하는 그 시점에서 나에게 세션 아이디가 발급되고..
그때부터 세션관리가 들어가는 겁니다..
그리고 이 공간에 값을 저장하면 사용자가 해당 웹서버의 어느 페이지를 보더라도..
그 공간에 저장된 값은 공통으로 쓰이는 것이고..
그러면서 사용자의 리액션이 있는지 점검을 해서..
일정 시간동안 리액션이 없으면 파기가 되는 것이지요..
데이터베이스에서도 접속의 개념으로 세션을 말합니다..
세션 유지를 위해 쿠키를 이용하는 그런것은 없습니다..
그런게 있다면 웹프로그래머가 세션이 끊어지는 경우에 대비하는 코딩을 할 이유가 없죠..제가 웹프로그래머다 보니..
쿠키로 방어하면 되니까요..하지만 그 부분을 쿠키로 해결하진 않습니다..
세션이 끊어지면 다시 로그인 페이지로 보내서 다시 로그인 하도록 유도를 하지..
무슨 쿠키를 유지하거나 하는 식으로 해결하진 않습니다..
쿠키가 파기가 안되게끔 설정한다 해도..
결국 세션은 사용자가 일정시간 이상 액션을 취하지 않으면 세션은 자동으로 없어집니다..
그리고 쿠키는 움직이는 개념이 도메인입니다..
도메인만 맞으면 웹서버쪽에서 인식하고 해당 쿠키 값도 읽어들입니다..
다만 이 부분은 세션과는 별개 문제입니다..
세션이 끊어지고 안끊어지고의 여부와는 상관이 없습니다..
"세션키는 일반적으로 서버에 처음 접속할때(제출할 세션 키가 없을때) 서버에서 발급해주는것"
이라고 주장하시는 내용으로 이미 써 두었습니다만??
질문자의 질문 의도는 "로그인"된 "세션"에 관한 질문이었습니다.
그리고 세션에 대해 열강을 해 주셨는데, 웹서버상의 세션의 실제 구현된 모습에 대해서는 개념 잘못 잡고 계신듯 합니다.
연결된 상태가 세션을 의미하는것은 맞지만, 디비와의 그것과는 다르게 HTTP는 접속 유지가 아닌 접속 종료후 재접속이기 때문에 세션을 유지하려면 클라이언트 측에 특별한 세션 식별자가 있어야 합니다.
그런역할을 보통 쿠키를 사용하므로, 사용자의 로그인이 필요하다면 그 쿠키값을 잘 유지하고 있어야 세션의 연결점을 잃어버리지 않는다는 내용의 글이었습니다.
웹서버의 세션에 대한 메카니즘은 여러방법이 있지만 쿠키에 발급된 세션키로 요청자를 식별하는 법이 가장 일반적입니다.
흔히들 사용하는 톰캣과 기타 WAS들(웹스피어, 웹로직)은 클라이언트가 세션키를 제출하지 않으면 무조껀 새로운 세션키를 할당하고 쿠키로 발급합니다. 이름은 제품마다 제각기 다르긴 합니다만...
이내용은 J2ee Document 상의 HttpSession 객체의 설명부분에도 잘 나와 있습니다.(URL rewirte 방식 혹은 cookie를 이용한 방식 - 전자는 쓰는경우 거의 없죠.)
물론 전적으로 세션에 설정된 데이터는 서버측 공간에 저장 되는것은 맞지만, 애초에 말씀드렸듯이 그 데이터의 식별자를 알려주는 것은 클라이언트 쿠키로 부터 제출된 세션 키입니다.
서버상에 데이터가 삭제되거나, 쿠키로 발급된 세션키를 제출하지 못하거나 둘다 해당 사용자의 세션은 소실된 것으로 보아야 합니다.
또한 세션은 서버상에 할당된 메모리공간이라는 표현을 쓰셨는데, 일반적으로는 별도의 특별한 파일시스템을 사용합니다.(세션 유지 기간이 길수록, 방문자가 많을수록 유휴 메모리 공간을 많이 차지하니까요.) 두방법 모두 이미 만료된 세션키를 제출 하였다 하여도 서버에 발생시킬 부하는 미미합니다.
저도 웹개발자네요.
Terry님께서 세션과 쿠키 그리고 http에 대한 이해가 깊지 않아 잘못 설명하신듯합니다.
이글 보시는 분들이 자칫 시간낭비할듯 하여 남기는 글이니 곡해마시기 바랍니다.
쿠키와 세션의 상관관계는 지나다가님의 말씀이 맞습니다.
http://www.ietf.org/rfc/rfc2109.txt
RFC 2109 보시면 http 헤더에서 2개의 메소드 cookie: set-cookie:를 이용하여 세션을 유지하는 방법에 대해서 기술합니다.
또한 이것은 넷스케이프 http1.0의 메소드에서 유래한다고 나와있습니다.
보통 http 프로토콜의 request 에 POST 또는 GET으로 id/pw 넘기면
서버사이드에서 정상여부 체크후 cookie/session으로 로그인여부를 체크합니다 (cookie는 논외)
session의 경우 session_key 값을 cookie에 싣어 http responce header의 set-cookie로 클라이언트에 보내며,
이후는 받은 cookie의 값 (예를 들면 sess_ 로 시작하거나 jsess_ 등) 을 차후 request의 header cookie값에 설정하여 보내면
서버측에서 해당 cookie의 name=value 값을 체크하여 해당 쿠키중 session과 일치하는 값의 키를 세션으로 인식하도록 되어있습니다.
쉽게 이야기하면 세션이던 쿠키던 로그인을 저장하는것은 http 프로토콜상에선 거의 같다고 보시는게 맞습니다.
결국 그이후 session의 time_out의 시간에 따라서 세션이 파기되는 문제는 질문자의 요지는 아닌듯합니다.
(이는 Terry님의 말씀처럼 서버 세팅값에 따라서 30분 ~ 1일 사이에 파기되도록 되어있습니다.)
질문자의 요지는 서버에 요청을 하고 응답 받았을때 response의 값중 set-cookie가 없다고 하는것 같은데.
이경우 서버에서 (서버 사이드 스크립트:php로 본다면) set_cookie 또는 set_session()의 호출이 정상적으로 일어 나지 않아서..
responce header 중 set-cookie 값이 없다고 하는것 같습니다.
나머지는 지나가다님께서 설명하셔서 생략합니다.
로그인 유지..에 대한 개념을 잘못 이해하신듯 하네요..
쿠키와 세션의 경우는 로그인 유지를 위해 쓰이는게 아니라요..
사용자들이 입력한 값(예를 들면 로그인 ID)를 보관하기 위한 용도로 쓰이는 겁니다..
로그인 유지는 웹서버의 세션에 의해서 이루어집니다..
예를 들면 웹클라이언트가 웹서버(이것도 정확하게는 웹서버가 아니라 웹어플리케이션서버(WAS)입니다)와 접속을 시도하게 되면..
웹서버에선 해당클라이언트에 대한 세션이 하나 만들어지게 됩니다..
근데 이 세션은 사용자가 아무런 액션을 취하지 않으면 정해진 시간 동안에만 유지가 됩니다..
흔히 사용자가 아무런 액션을 취하지 않고 20분정도 지나면 세션이 사라지게 됩니다..(물론 이 시간은 늘려서 설정할수도 있습니다)
그래서 그 시간이 지나면 세션이 사라지기땜에..
세션에 저장되었던 내용들이 날라가는 것이지요..
로그인에 사용되는 값을 저장하기 위해 세션이나 쿠키(지금 님이 사용하시는 것은 서버사이드 쿠키입니다, 클라이언트 사이드 웹브라우저에 저장되는 스타일로 자바스크립트로 하죵)를 이용할수 있어도..
그 값을 유지하는 것은 웹서버 셋팅쪽의 문제입니다..
그리고 이 값을 계속 유지해서도 안됩니다..
아무런 작업도 안하는 사용자가 많이 있고 그런 사용자들의 세션을 계속 보관하는것은 웹서버로서도 무리가 있죠..
그래서 일정 시간이 지나면 끊어지도록 가는게 맞습니다..
다만 방어적인 코딩 차원에서 세션이 끊어졌을 경우..
보관해 놓은 값을 이용해서 다시 재로그인을 시도할수는 있겠죠..