로그인에 실패하는 경우 세션이 생성되는 이유가 무엇인지 궁금했다.
JSESSIONID란, 톰켓 컨테이너에서 세션을 유지하기 위해 발급하는 키를 말한다. 이 키를 발급하는 이유는 HTTP 프로토콜의 특징 중 하나인 무상태성(Stateless)때문이다.
브라우저에 접속하면 접속할 때마다 서버 입장에서는 누가 접속을 한지 모른다. 그래서 서버는 브라우저가 최초 접속할 때 WAS 내 세션을 만들고 세션 아이디를 발행해 쿠키에 저장한다. 그럼 브라우저가 다음 접속 시 서버가 이 세션 아이디를 보고 접속 브라우저를 식별한다.
HTTP 프로토콜의 경우 요청이 올 때마다 새로운 연결을 생성하고 그 요청에 대한 응답을 보내면 연결을 끊는다. 이런 무상태성 프로토콜 성질과 다르게 상태를 계속해서 유지할 필요가 있다.
톰켓 서버는 상태를 유지하기 위해 JSESSIONID라는 것을 클라이언트에게 발급해 쿠키로 저장한다. 그리고 재요청 시에 쿠키를 읽어 이전 상태를 유지한다.
로그인에 성공해야만 무조건 세션이 생성되는 것이 아니다. 로그인에 실패했어도 실패했다는 것 또한 서버랑 연결되어있었다는 상태를 알려주는 것이므로 세션이 생기게 되는 것이다. 이 로그인의 성공/실패 여부를 세션 안에 저장하는 것이다.
이해를 돕기 위해 식당을 예로 들어 이해할 수 있다.