작성
·
682
0
안녕하세요!
항상 좋은 답글 달아주셔서 감사합니다!
이번 질문 글에서는 HttpSession의 동작 방식에 대해 어려운 부분이 있어 문의드리고 싶어 글을 적습니다.
HttpSession session = request.getSession();
session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember);
log.info("RESPONSE COOKIE = {} ",response.getHeader("JSESSIONID") );
log.info("RESPONSE COOKIE = {} ",response.getHeaders("JSESSIONID") );
return "redirect:/";
제가 궁금한 것은 위의 코드와 관련된 부분입니다.
위의 코드에서는 HttpServletRequest에서 session 값을 얻어서, 그곳에 loginMember를 저장하면서 Session과 Member를 Mapping 해주는 것으로 이해하고 있습니다.
그런데 특이한 점은 Response에 만들어진 Session이 쿠키 형태로 포함되지 않고 나간다는 점입니다. 위 코드를 실행하면 위의 콘솔창에서 볼 수 있듯이, Response에는 어떤 쿠키도 포함되어 나가지 않습니다.
개발자 도구에서도 POST /login에서는 Response에 JESSIONID가 쿠키로 포함되어 오지 않는 것으로 확인이 됩니다.
그렇지만 Redirect를 할 때는 JSSESIONID라는 쿠키가 포함되어 Request 되는 것을 볼 수 있습니다.
내용을 상세히 정리하면 위와 같습니다.
질문을 간단히 정리하면 다음과 같습니다.
1. Request를 통해 얻은 HttpSession은 response가 나갈 때, 쿠키로 클라이언트에 전달되나요?
2. Response로 전달된다면 제가 어떻게 그 부분을 확인할 수 있는지 알려주실 수 있으실까요?
3. Response로 전달되지 않는다면 어떤 형태로 클라이언트에 전달되는지 알려주실 수 있으실까요?
번외 질문 : session.setAttribute("loginMember", loginMember)를 하면 마치 ConcurrentHashMap처럼 저장되는 것으로 이해를 하고 있습니다.
"loginMember"만을 저장해둔 ConcurrentHashMap에 session.getId를 key로 value는 loginMember가 저장된다고 이해하면 될까요?
항상 좋은 답변 주셔서 너무 감사합니다.
새해 복 많이 받으세요!
답변 2
0
1. 제가 이해하기로는 클라이언트에게 세션 객체를 전달하는 것이 아니라 jsessionid를 전달한다는 것 같은데, 제가 제대로 이해한 게 맞을까요?
2. 만약 클라이언트에게 jsessionid가 전달되는 게 아니라고 한다면(클라이언트가 따로 전달받는 값이 없다면), 클라이언트 → 서버로 요청이 들어올 때도 jsessionid가 포함되지 않을 텐데(전달받은 값이 없었으므로) 톰캣은 어떻게 동일한 사용자라는 것을 식별할 수 있는 걸까요?
3. 만약 jsessionid가 클라이언트에게 전달되는 것이 맞다면, response 객체를 통해 전달되는 것이 아닌가요? jsessionid를 톰캣이 내부적으로 내려준다는 말씀이 response 객체 외에 톰캣이 다른 어떤 객체(혹은 네트워크)를 통해 클라이언트에게 따로 전달해준다는 의미인지 궁금합니다.
0
안녕하세요. ...님, 공식 서포터즈 David입니다.
.
1. Request를 통해 얻은 HttpSession은 response가 나갈 때, 쿠키로 클라이언트에 전달되나요?
=> 아니요.
3. Response로 전달되지 않는다면 어떤 형태로 클라이언트에 전달되는지 알려주실 수 있으실까요?
Session은 따로 클라이언트에 전달되지 않습니다. 필요하다면 세션에서 값을 꺼내 cookie에 저장하여 클라이언트에게 응답과 함께 보낼 수 있습니다.
번외 질문 : session.setAttribute("loginMember", loginMember)를 하면 마치 ConcurrentHashMap처럼 저장되는 것으로 이해를 하고 있습니다. "loginMember"만을 저장해둔 ConcurrentHashMap에 session.getId를 key로 value는 loginMember가 저장된다고 이해하면 될까요?
=> Session들을 모아두는 Session 저장소가 있습니다. 이 저장소의 key가 sessionId입니다.
sessionId를 통해 특정 Session을 가져오고, 가져온 Session 내에서 key(loginMember)를 가지고 loginMember 값을 가져올 수 있습니다.
.
감사합니다.
답변 감사합니다!
알려주신 내용에서 더 궁금한 점이 있어서 글을 적습니다.
그렇다면 어떻게 로그인이 유지되는지 이해를 할 수가 없습니다.
처음 이해한 것은 클라이언트와 서버가 쿠키를 주고 받아서, 이 쿠키로 로그인 유지를 확인한다고 했습니다. 나중에 UUID로 만든 쿠키를 실제로 내려주기도 했고, 그것이 쿠키 역할을 한다고도 강의해서 설명해주셨습니다.
이후 UUID → HttpSession으로 넘어오는 과정에서 UUID와 session이 동일하게 동작하는 것으로 설명을 해주셨는데.. UUID를 사용한 코드에서는 UUID가 실제로 setCookie를 통해서 response에 쿠키를 전달해주었습니다.
그리고 로그인 이후, 클라이언트는 개발자 도구로 확인 시 RequestHeader에 항상 JSSESSIONID라는 쿠키를 보내고 있습니다. 그렇다면 클라이언트가 보내는 JSESSIONID 쿠키는 어디서 얻게 된 값인지 알 수 있을까요? 코드 상에서는 클라이언트가 내려주지 않는 것으로 보이고, 답변에서도 쿠키를 내려주지 않는다고 말씀해주셨습니다.
그리고 JSESSIONID를 클라이언트가 서버로부터 받는 것이 없다고 하면, 클라이언트가 로그인 이후 요청을 하면 클라이언트가 보낸 어떤 정보를 보고 서버가 해당 클라이언트에 대한 세션을 가지고 오게 되는 것인가요 ?
항상 좋은 답변 주셔서 감사합니다!
jsessionid는 톰캣이 내부적으로 내려주는 것입니다.
jsessionid를 key로 사용하여 세션들을 관리합니다.
jsessionid를 가지고 세션을 보관하는 저장소에서 특정 세션을 꺼냅니다.
동일한 jsessionid라면 서버는 동일한 사용자의 요청으로 인식합니다.
로그인한 사용자라면 jsessionid를 통해 꺼내온 세션에 loginMember가 있을 것이고 아니라면 loginMember가 없을 것입니다.
안녕하세요. kt y님, 공식 서포터즈 David입니다.
.
1. 네, 맞습니다.
2. jsessionid가 클라이언트에게 전달됩니다.
3. 응답의 쿠키로 jsessionid가 담겨져 클라이언트에게 전달됩니다. jsessionid가 발급되고 응답에 쿠키로 넣는 것은 tomcat이 처리합니다.
.
감사합니다.