🤍 전 강의 25% 할인 중 🤍

2024년 상반기를 돌아보고 하반기에도 함께 성장해요!
인프런이 준비한 25% 할인 받으러 가기 >>

  • 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

세션 개념이 잘 이해가 되지 않아서 질문입니다

23.04.10 11:29 작성 조회수 543

1

  • 세션 만들기

//로그인 성공 처리
//세션이 있으면 있는 세션 반환, 없으면 신규 세션 생성
HttpSession session = request.getSession();
//세션 로그인 회원 정보 보관
session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember);

 

  • 세션 지우기

HttpSession session = request.getSession(false);
if (session != null) {
    session.invalidate();
}

 

  • 세션 확인하기

HttpSession session = request.getSession(false);
if (session == null) {
    return "home";
}

쿠키는 클라이언트 측에서 저장하고 세션은 서버측에서 저장한다고 알고 있는데요. request 로부터 getSession을 통해 얻는 것이 무엇인지가 궁금합니다.

request.getSessin()을 통해 얻는다는 것은 사용자의 요청으로부터 얻은 Session이고 여기에 setAttribute 하는 것은 서버에 데이터를 저장하는게 아니라 사용자의 요청에 저장을 하게 되는 것 아닌가요 ?? (setAttribute가 사용자의 request와 서버 모두 저장하는 것인가요?)

session은 cookie와 같다면 서버 내부적으로 어디에 저장돼서 어떻게 확인할 수 있는 건지 궁금합니다.

답변 1

답변을 작성해보세요.

0

y2gcoder님의 프로필

y2gcoder

2023.04.10

안녕하세요, hjemsti 님. 공식 서포터즈 y2gcoder 입니다.

request.getSession() 의 이름 자체에서 혼동이 오신 것 같습니다.

세션은 서버 측에서 관리되며, request.getSession()을 통해 얻는 것은 사용자 요청과 연관된 세션 객체입니다.세션 생성 시 WAS(여기서는 톰캣입니다.)에서 생성한 고유한 세션 ID를 쿠키로 클라이언트에 저장합니다. 그래서 요청 시 보내지는 Session ID의 쿠키를 이용해 서버에 저장된 세션 저장소에서 클라이언트에 맞는 세션 객체를 가져오는 것입니다.

session.setAttribute()를 하면 해당 데이터는 서버 측의 세션 저장소에 저장됩니다. 사용자의 요청에 저장되는 것이 아닙니다.

잘 이해가 가지 않으신다면 해당 챕터를 다시 반복해주시길 권합니다.

감사합니다.

hjemsti님의 프로필

hjemsti

질문자

2023.04.10

답변 감사합니다 제가 헷갈리는 것이 예를들면

Session session = request.getSession()

server.saveSession(session) <- 제가 임의로 만든 표현입니다

이런식으로 되어야 할 것 같은데

session.setAttribute가 request.getSession().setAttribute()랑 같은 표현이지 않습니까 ?? 그럼 결국 request에 저장이 되는 것 아닌가 이게 헷갈립니다 ...

y2gcoder님의 프로필

y2gcoder

2023.04.10

request에는 항상 세션ID를 지닌 쿠키가 따라옵니다.
그러면 해당 쿠키로 서버에 있는 세션 저장소에서 해당 세션ID를 key로 가지고 있는 세션 객체를 찾아서 반환해주는 것입니다 :)

예를 들어 hjemsti님이 아이스 아메리카노가 마시고 싶어 카페에 가셨습니다. 카페 앞에 있는 키오스크를 이용해서 아이스 아메리카노를 주문하셨습니다. 그러면 키오스크가 아이스 아메리카노를 주문 받고, 키오스크가 아이스 아메리카노를 만들어서 hjemsti님께 전달까지 해주지는 않습니다. 키오스크는 결제, 주문까지만 담당하고 커피를 만들어주는 것은 보통 바리스타 분입니다.

좀 더 개발 친화적인 예시를 들어보자면 DB에 저장된 객체를 불러오는 것도 가능할 것 같습니다. hjemsti님이 만드신 아주 멋진 A서비스가 있습니다. A서비스의 서버는 애플리케이션 로직이 있는 서버와 DB 서버가 분리되어있습니다. 사용자들이 애플리케이션 서버를 통해 회원가입을 하면 모두 DB에 저장하고 있습니다. 사용자들이 로그인을 하면 애플리케이션 서버를 거쳐 DB에 저장되어 있는 자신의 정보를 조회할 수 있습니다. 근데 hjemsti 님의 말씀대로 하면 사용자들은 애플리케이션 서버를 거치니까 결국 사용자들의 정보는 애플리케이션 서버에 저장되어있다고 말씀하시는 것이나 마찬가지입니다.

request.xxx()라고 해서 request에 저장되는 것은 아닙니다. 천천히 다시 생각해보시길 권해드립니다 :)

 

hjemsti님의 프로필

hjemsti

질문자

2023.04.11

아아 request.getSession 하면 request안에 있는 쿠키를 기반으로 서버에서 Session을 찾아 반환해주는 것이 맞나요?

맞다면 저는 session을 얻으려면 server.getSession(request) 이런 식일줄 알았는데 아니라 헷갈린 것 같습니다. 감사합니다!

y2gcoder님의 프로필

y2gcoder

2023.04.12

파이팅입니다

채널톡 아이콘