Loading...

Spring/Blog-V1 / / 2022. 3. 8. 17:46

스프링 27강. 세션과 쿠키

반응형

http 특징

 

사용자는 request를 하고, 서버는 response를 한다. 항상!

 

stateless한 상태

-> 서버는 클라이언트가 누구인지 매번 확인해야한다.

-> 상태 지속 stateful한 척하기 위해 세션쿠키가 필요하다.

 

한번이라도 요청하면 서버가 들고있는 세션 아이디가 있다.

자기 서버의 세션 메모리 영역을 찾을 수 있는 키 값인 것이다.

 

request 헤더에는 Cookie 키 값에 저장

request.getHeader.Cookie

 

response 헤더에는 Set-Cookie 키 값에 저장

response.setHeader.Set-Cookie (서버쪽 응답)

 

서버는 최초의 응답을 할 때 헤더에 쿠키를 심어준다.

헤더의 Set-Cookie 키 값에 심어주는 것이다.

 

http request 요청 Header

: Post, Put 요청일 때만 MIME 타입이 있다.

body가 있는 요청에만 설명을 해주는 것이다.

MIME타입의 키 값은 Content-Type이다.

 

http response 응답 Header

: MIME 타입이 무조건 있다.

성공적으로 INSERT(UPDATE) 했다는 대답이라도 돌아오기 때문에

무조건 body가 존재한다.

응답할 때 쿠키를 헤더에 넣어주는데 형식은 다음과 같다.

 

Set-Cookie: 키=값;키=값

 

세미콜론을 기준으로 파싱된다.

 

내가 직접 쿠키를 추가해주고 싶으면

response의 setHeader에 추가!

 


 

Set-Cookie

 

(1) 기본적으로 응답하는 디폴트 쿠키

JSessionId = AJDFJ2381999FF (해시 값)

 

(2) 개발자가 직접 생성한 쿠키

phone = 1234

 

(3) 브라우저는 응답을 받으면

브라우저가 가진 쿠키라는 저장소에 쿠키를 저장한다.

그리고 서버는 자신의 세션 영역에 JSessionId 영역을 만든다.

 

클라이언트쪽 브라우저의 디폴트를 바꿀수는 없지만

서버의 디폴트는 제어가 가능하다.

 

* 세션은 서버의 저장소, 쿠키는 클라이언트의 저장소 *

 


서버의 세션은 모든 클라이언트가 공유하지만

쿠키는 단독적으로 클라이언트 개인이 가지고 있는 것이지

쿠키를 위한 영역이 따로 나누어져 있는것은 아니다.

그리고 브라우저의 쿠키 저장소에 쿠키가 저장되어 있다면

다음 요청 시 브라우저가 가지고 간다. 디폴트로!

=> 프로토콜

 

서버는 최초에 응답할 때를 제외하고는

쿠키를 돌려주지 않는다.

 

쿠키(JSessionId)는 브라우저만이 해석할 수 있다.

브라우저만이 쿠키를 읽을 수 있지만 수정은 불가능하다.

 

어플리케이션이나 다른 타 기기에서는 이 쿠키를 Read 하지도 못한다.

 

클라이언트는 도메인마다 쿠키 영역을 나누어 저장한다.

내 사이트에서 들고온 데이터를 다른 사이트에서 볼 수 있어

개인정보가 위험하기 때문이다.

클라이언트는 서버에게 request 한다.

그럼 서버는 최초의 response시에 JSessionID:7788을 날린다.

그리고 세션은 클라이언트의 상태를 저장하여 stateful 상태이다.

 

이때 상태를 파일, DB 어디든 저장되어 있다면 stateful한 상태이다.

 

선은 끊기고 request와 response는 날아갔기 때문에 stateless인데

상태는 저장되어 있으니까 stateful한 척 하는것이다.

 

클라이언트의 쿠키 저장소에 naver.com 영역을 따로 만들고

이 영역에 JSessionId:7788을 저장한다.

 

개인정보 때문에 도메인별로 따로 나누어놓았다.

 

이후 네이버에 두번째 요청을 하면 7788을 무조건 가지고간다.

쿠키를 저장해놓은게 브라우저이기 때문에

브라우저가 챙겨가는것이다.

 

이게 브라우저가 아니라 핸드폰 어플이였다면

쿠키를 가지고 가지 않는다.

 

앱은 브라우저가 아니라 내가 직접 쿠키를 만들어야 하고,

http 프로토콜이 지켜서 만들어져있지 않기 때문이다.

 

내가 BufferedWrite 할 때마다 쿠키를 보내주지 않으면

쿠키를 가져가지 않는다.

 

이건 브라우저에만 국한되어있는 기술이다!

 


 

JSessionId 값은 브라우저가 읽을 수 있다.

response Header에서 읽으면 된다.

 

하지만 수정이 불가능하다.

JSessionId는 final이고, readonly이기 때문이다.

 

하지만 다른 타 기기에서는 읽는것 조차도 못한다.

그렇기 때문에 담아가지도 못하는 것이다.

 

그렇지 않은 모든 헤더는 담을수도 있고, 읽을수도 있다.

세션아이디가 민감하고 예민한 데이터이기 때문에 특별한것이다.

 

총 정리!

 

쿠키는 클라이언트가 아닌 브라우저의 저장소,

세션은 서버의 저장소!!

 

[출처]

https://cafe.naver.com/metacoding

 

메타코딩 : 네이버 카페

코린이들의 궁금증

cafe.naver.com


메타 코딩 유튜브
https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9

 

메타코딩

문의사항 : getinthere@naver.com 인스타그램 : https://www.instagram.com/meta4pm 깃헙 : https://github.com/codingspecialist 유료강좌 : https://www.easyupclass.com

www.youtube.com

 

반응형