Burninghering's Blog
article thumbnail

1. 세션이란?

서로 관련된 요청(응답)을 하나로 묶은 것 - 묶기 위해 쿠키를 이용

브라우저마다 개별 저장소(session객체->서버에 저장)를 서버에서 제공 (쿠키가 브라우저에 저장되기 때문에)

브라우저가 요청을 보내면

서버가 세션아이디를 준다.

다음 요청부터는 쿠키가 자동으로 간다.

요청이 원래는 독립적이지만, 쿠키를 이용해 세션아이디를 주므로

세션아이디라는 꼬리표가 요청에 따라붙기 때문에

같은 세션 아이디를 가진 요청들은 같은 세션에 포함되는 것으로 한다.

같은 세션에 포함되어있는 동안 세션 저장소(세션 객체)도 같이 쓴다.

 

끝내는 방법

1. 수동 종료

2. 자동 종료 : 특정 시간 지나면 새로운 세션 아이디 발급 


2. 세션의 생성 과정

처음에 브라우저가 요청을 하면 서버가 무조건 세션 객체(저장소)를 만든다

세션 객체마다 세션 ID를 가지고 있다.

그리고 저장소마다 쓸 수 있게 세션 ID가 담긴 쿠키를 만들어서 응답으로 보낸다.

보내면 브라우저마다 쿠키가 저장되는데, 요청에 쿠키가 자동으로 따라간다. (세션 아이디가 계속 요청에 따라간다.)

 

서버는 응답헤더의 셋쿠키를 통해 세션 아이디를 준다.

브라우저는 쿠키가 만들어지고, 다음 요청부터 모든 요청에 세션 아이디가 딸려간다. 

서버는 세션아이디를 보고 같은 브라우저에서 온 요청인지 판단한다. 

 세션 아이디가 일치하는 같은 세션 객체를 사용할 수 있다.


3. 세션 객체 얻기

쿠키는 브라우저마다 저장되기 때문에 서로 다른 브라우저라면 다른 세션아이디를 서버로부터 받아 저장한다.

그다음부터 요청하면 브라우저에 저장된 세션아이디가 자동으로 서버에 전송된다

컨트롤러에서는 세션 저장소를 사용하고 싶으면 request.getSession()을 사용하면 된다.(요청 정보가 다 들어있으므로 request)

세션 아이디를 보고 일치하는 세션 객체를 찾아서 거기에 setAttribute하면 저장을 하게 된다.(key-value형태)

 


4. 세션과 관련된 메소드


5. 세션의 종료

 

같은 세션의 요청 간격이 일정 시간 이상이라면

새로운 세션 아이디를 발급한다. (새로운 새션 객체(저장소)가 만들어진다)

(기존에 사용하던 세션 저장소는 사용하지 못한다)


 

6. 쿠키와 세션 비교

서버가 여러곳인 회사에서,

맨 앞의 서버가 로드 밸런싱을 할 때(여러 서버로 세션 객체를 만들 때)

한 개의 서버에 만들었다가 다른 서버에 만들었다면 세션 동기화가 필요하므로

서버 다중화일 때는 세션이 불리하고 쿠키에 저장하는 것이 더 유리하다


7. 실습

첫 번째 요청을 하면, 서버가 세션 아이디를 응답으로 보내줌

그 응답을 브라우저가 쿠키로 저장

 

만약 쿠키를 허용하지 않는다면,

URL에 GET방식으로 세션 아이디를 붙여야한다.

쿠키를 허용하지 않는 브라우저에는 모든 URL에 JSESSION ID를 붙이고 

서버에 요청을 할 때 세션 아이디가 URL과 함께 전송되도록 해야한다.

그렇다면 쿠키를 허용하지 않아도 요청한 URL을 통해 세션 아이디를 얻을 수 있다.

 

URL 뒤에 붙이는 것은 URL 태그가 자동으로 붙여주는 것이므로

뷰를 작성할 때 링크에 url 태그를 꼭 넣어야 한다.

 

8. 첫 번째 요청

첫 번째 요청에는 서버가 JSESSION ID를 보내준다

쿠키를 허용하는 지 안하는 지 알 수 없으므로

두 가지 방법으로 JSESSION ID를 보내준다.

1. 주소 뒤에 붙여주기

2. 네트워크 - Response Header의 Set-Cookie

 

(만약 쿠키 허용이라면,

두 번째 요청부터는 URL에 세션 아이디가 붙지 않는다

쿠키를 허용하지 않는다면,

URL에 계속 붙는다.)

 

c:url을 사용하지 않고 하드 코딩을 한다면 세션 아이디가 붙지 않으니

서버로서는 브라우저가 계속 처음 요청을 보내는 것으로 인식하고

서버는 요청이 오면 무조건 세션 객체를 만들고, 그 다음부터는 같은 브라우저가 요청이 오면 그 세션을 써야하는데

url태그도 쓰지않고 쿠키도 허용해놓지 않으면

클라이언트를 구별할 방법이 없는 것이다. (같은 브라우저가 요청을 보내도 다른 브라우저가 요청을 보내는 것으로 인식하고 세션 아이디를 계속 다른 아이디로 보내주며 계속 세션 객체가 만들어진다. -> 서버 부담 커짐)

 

반드시 모든 URL에 url 태그를 사용해야한다!


본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

http://bit.ly/3Y34pE0

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

 

profile

Burninghering's Blog

@개발자 김혜린

안녕하세요! 반갑습니다.