인프런 커뮤니티 질문&답변

박시균님의 프로필 이미지

작성한 질문수

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술

로그인 처리하기 - 서블릿 HTTP 세션1

세션의 동작원리와 코드에 대해서 질문드립니다

작성

·

721

3

직접 세션을 만든경우 이런메커니즘으로 이해했습니다.

예를들어 유저a가 처음로그인할경우에

1.세션id 생성 (1234 라고가정)

2.세션store(Map)에 저장(1234,유저a)

3.쿠키생성("mySessionId", 1234)

4.쿠키를 response에 저장후 응답

다시 요청을하면

5. 서버는 클라이언트가 넘겨준 여러개의 쿠키중("mySessionId", 1234) 쿠키를 찾고

6. 서버는 이 쿠키를 가지고 세션store에서 유저a정보를 찾아낸다.

이때 세션이라는게 세션store에 저장된 (key,value)한 쌍을 세션이라고 보는건가요??

아니면 세션store(Map)자체를 세션이라고 보는건가요?

그리고 HttpSession 이라는 기능을 사용했을때 

1. HttpSession session = request.getSession();

2.session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember);

이 두줄의 코드가 위의 1,2,3,4의 역할을 한다고 보면 되는건가요?

그렇다면 request.getSession()이 세션을 생성하거나 반환하는것과 더불어

세션id를 생성하고 쿠키도 생성하는 역할을 하는건가요?

사실 이것뿐만 아니라 HttpSession기능을 사용하였을때 원리가 머릿속에 그려지지가 않습니다 ㅠㅠ

질문이 많아서 죄송합니다.. 계속 돌려봐도 이해가 잘 되지 않아 질문드립니다

답변 1

2

안녕하세요. 박시균 님, 공식 서포터즈 codesweaver 입니다.

.

생각하고 계신 내용이 맞습니다. 세션은, 클라이언트와 서버 사이에서 서버가 클라이언트의 정보를 기억하는 것, 또는 그것을 임시적으로 기록한 파일을 말합니다. 그러니 store 전체가 세션이라고 볼수 있고 각각의 키:값 쌍도 세션이라고 할 수 있습니다. (세션의 데이터)

.

1. HttpSession session = request.getSession();

사용자의 request 정보를 가지고 키를 생성합니다. (이미 존재할 경우 패스). 보통 이 키는 중복되지 않음을 보장합니다. 그래서 세션에 담은 데이터가 다른 유저와 섞이는 경우는 없습니다. 그리고 해당 키를 클라이언트의 쿠키에 담아서 응답합니다.  이후 클라이언트는 모든 request에 쿠키를 전달하므로, 서버는 이 쿠키에 세션 키를 찾아서 세션 데이터가 존재할때의 처리를 할 수 있습니다.

2.session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember);

세션에 저장할 정보를 담는 코드 입니다. 세션 내부에서 또다시 키:값으로 데이터를 매핑하여 보관합니다. (키와 값을 Map에 저장하는것과 마찬가지 입니다. 그러면 나중에 값을 꺼내어 쓰기 편하겠죠?)

.

감사합니다.

박시균님의 프로필 이미지
박시균
질문자

답변 감사합니다!!

질문이 하나 더 있는데

직접 세션을 만들어서 사용하였을때는  키:값 으로 (sessionId , loginMember) 를 사용했는데

session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember);

이 코드를 사용하게 되면 sessionId 대신 SessionConst.LOGIN_MEMBER가 사용되는건가요?

만약 그렇다면 SessionId의 사용처가 어딜까요??ㅠ

안녕하세요 박시균님!

1. 

서버는 수많은 클라이언트가 동시에 접속합니다. 그리고 이 클라이언트마다 고유한 세션아이디를 사용해야 겠죠? 그래서 서버의 특정 폴더( /etc) 에 sessionId 로 파일을 생성하여 보관합니다. 그리고 클라이언트가 쿠키로 세션아이디를 보내오면 이 아이디로 생성된 파일이 있는지 조회합니다.  sessionId 는 이 때 사용합니다. 직접 Session을 구현했을 때는 sessionId를 직접 만들어야 했지만, Session이라는 객체를 사용하면, Session 객체 내부에서 sessionId를 새로 발급하는 일 등을 알아서 처리합니다.

.

2. 

session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember);

그리고 이 세션파일을 열면 그 안에 파일이 어떤 형식으로 저장되어 있는가의 문제가 바로 위의 코드 입니다. SessionConst.LOGIN_MEMBER 복잡하고 긴 이름때문에 무섭게 생겼지만 사실은 상수값일 뿐입니다. 그러니 이 값을 100 이나 101 같은 숫자로 변경해서 사용하는것도 가능합니다. 이러한 숫자를 매직넘버라고 합니다. 매직넘버의 의미는 마법주문을 외우는 것처럼 그 의미를 알 수 없는 숫자라는 뜻입니다.

매직넘버로 값을 저장하게 되면 나중에 값을 찾아야 할 때 문제가 생깁니다, 어떤 숫자에 어떤 값을 넣어놨는지 의미를 파악할 수 없게 됩니다.("도대체 100이 의미하는게 뭐지??") 그래서 불편함을 위해 매직넘버를 사용하지 말고 상수를 이용하도록 권장하는 것입니다. 그래야 이 숫자가 무슨의미인지 알 수 없으니까요 (SessionConst.LOGIN_MEMBER 라는 값을 보면 누구나 '아! 로그인한 멤버를 저장했구나' 라고 이해하겠죠?)

.

감사합니다.

박시균님의 프로필 이미지
박시균
질문자

친절하고 자세한 답변 감사합니다!!

이제 이해가 잘됐어요!!