해결된 질문
작성
·
246
3
안녕하세요.
HTTP 세션 강의를 듣다가 의문이 들어 질문드립니다.
직접 세션을 만들어서 구현했을 때는 Map 구조에 key, value 형태로 메모리 저장으로 세션을 구현했는데요.
1. HTTP 세션도 이와 동일한 원리라고 하셨는데, 그러면 request.getSession()을 하게 되면, key, value 형태의 Map구조에 들어갈 배열이 생성되는 것이고, setAttribute()로 서버 내부의 Map 구조에 저장되는 형태인가요? 세션이 생성, 저장되는 정확한 원리가 궁금합니다.
추가적으로 이해가되지 않는 부분이 있습니다.
2. logout 기능에서 request.getSession(false)로 세션을 받아 세션이 null이 아니라면 invalidate()로 제거해주었는데요. 여기서 서버에는 현재 로그인한 사람뿐만 아니라 다른 유저의 세션 값도 존재할텐데, getSession()으로 어떻게 나와 관련된 세션만 얻어올 수 있는지 궁금합니다.
직접 세션을 구현했을 때는 Map구조이기 때문에 key 값으로 조회를 했는데요. 여기서는 아무런 매개변수 없이 찾는다는게 의문이었습니다. (클라이언트 마다 세션이 독립적으로 개별로 생성되고, 관리되는 형태일까요? )
질문을 작성하면서 아무래도 제가 무언가 놓치고 있다는 생각이 들었습니다. 혹시라도 잘못된 방향의 질문이라면, 제가 부족할만한 지식이 무엇인지 알려주시면 감사하겠습니다.
답변 1
4
안녕하세요, snowdrop6342 님. 공식 서포터즈 codesweaver 입니다.
.
1. request.getSession()을 호출하였을때 해당 접속자에 대한 세션파일이 없다면 생성, 있다면 생성된 세션파일을 객체 형태로 사용할 수 있는 HttpSession 객체를 반환합니다. 세션 파일은 말씀하신것처럼 key=value 형태의 텍스트 파일입니다. 이를 HttpSession 객체가 getAttribute, setAttribute 등의 인터페이스를 제공하여, 개발자가는 세션을 편하게 사용할 수 있습니다.
2. 세션을 생성할때 세션 키를 유니크 값으로 생성합니다. 그래서 모든 접속자는 각자의 고유한 세션 키를 서버로부터 발급받습니다, 이후 클라이언트가 추가적인 요청을 할 때 이 세션 키를 서버로 함께 전송하여 식별하는 작업을 거치게 됩니다. 자신의 세션키에 해당하는 파일 외의 파일은 제어할 수 없기에 안전합니다.
.
추가로, 이런 세션의 작동원리 때문에 여러대의 서버가 업무를 분산 처리하고 있는 경우, 세션 파일의 공유 문제가 복잡해집니다. serverA에서 발급한 세션 키를 serverB 에서 사용할 수 없기 때문입니다.
.
감사합니다.
안녕하세요.
친절한 답변 정말 감사드립니다!!