쿠키.. 세션... 인터넷을 사용하다보면 꽤 많이 들어보는 단어이다. 쿠키란 대체 무엇일까?
강의를 통해 공부하면서 블로그에서 정보를 찾다가 아주 잘 정리가 되어있는 블로그를 찾아서 조금 인용을 하고자 한다.
쿠키란?
-
쿠키는 클라이언트(브라우저) 로컬에 저장되는 키와 값이 들어있는 작은 데이터 파일입니다.
-
사용자 인증이 유효한 시간을 명시할 수 있으며, 유효 시간이 정해지면 브라우저가 종료되어도 인증이 유지된다는 특징이 있습니다.
-
쿠키는 클라이언트의 상태 정보를 로컬에 저장했다가 참조합니다.
-
클라이언트에 300개까지 쿠키저장 가능, 하나의 도메인당 20개의 값만 가질 수 있음, 하나의 쿠키값은 4KB까지 저장합니다.
-
Response Header에 Set-Cookie 속성을 사용하면 클라이언트에 쿠키를 만들 수 있습니다.
-
쿠키는 사용자가 따로 요청하지 않아도 브라우저가 Request시에 Request Header를 넣어서 자동으로 서버에 전송합니다.
출처 : 쿠키와 세션 개념 by 라이언곰돌이푸, https://interconnection.tistory.com/74
쿠키는 사용자 웹 브라우저에 저장되는 데이터이며 서버에 저장되는 데이터가 아니다.
요청이 발생했을 때 웹 브라우저는 쿠키에 저장된 정보를 서버에 전달하게 된다. 이때 쿠키 정보까지 같이 묶어서 보낸다. 응답결과로 쿠키정보가 전달이 되면 웹 브라우저가 쿠키에 저장하게 된다. 쿠키는 사용자 브라우저에 저장되는 것이므로 브라우저가 전달해 줄 때만 쿠키정보를 사용할 수 있다.
서버측 코드로 쿠키에 데이터를 저장할 수 있는 방법은 없다. 브라우저로 보낼 응답결과에 저장할 쿠키정보를 담아 보내면 브라우저에 의해 웹 브라우저에 쿠키가 저장되게 된다.
서블릿, JSP에서는 어떻게 쿠키를 사용했었는지 한번 생각해보자.
쿠키를 저장하기 위한 코드이다. 우선 쿠키는 문자열 데이터만 저장이 가능하기 때문에 문자열 데이터를 집어 넣어야하고, 한글 데이터를 받기 위해서는 UTF-8로 인코딩을 해주어야 한다. (받을 때는 디코딩도 따로 해주어야 한다.)
웹 브라우저에게 쿠키를 담아서 응답결과로 보내야하기 때문에 response객체를 매개변수로 사용한다.
data1과 data2에는 각각 문자열1, 문자열2 라는 문자열을 인코딩하여 담아주고 그 문자열 변수를 쿠키에 담아준다.
setMaxAge를 이용하여 쿠키의 유효시간을 정해준다. 유효시간이 정해지면 브라우저가 종료되어도 쿠키데이터는 사라지지 않는다. 그 후, addCookie하여 쿠키를 response객체에 담아준다.
크롬에서 F12를 누르면 다음과 같이 개발툴을 볼 수 있다. Application탭을 클릭하면 왼쪽에 Cookies라는 쿠키데이터 목록이 있는 것을 볼 수 있다. 현재 이 브라우저에는 아직 쿠키데이터를 요청하지 않았기 때문에 아무것도 안보인다.
위해서 해준 쿠키데이터와 함께 브라우저를 요청해보면,
이렇게 서버에서 Response객체에 넣어서 보내준 Cookie객체가 잘 나오는 것을 볼 수 있다.
인코딩을 해서 보내주었기 때문에 Value는 인코딩이 된 모습으로 보인다! 저 Value를 이용하기 위해서는 인코딩을 하여야 한다.
이번에는 웹 브라우저가 가진 Cookie를 가져와 보겠다.
Servlet, JSP에서는 쿠키정보를 받아올 때 특정 쿠키 몇개만 선별적으로 읽어낼 수 없다...
위와 같이 우선 쿠키배열로 쿠키데이터 전부를 받아온 후, 반복문을 이용해서 쿠키의 이름을 비교하여 사용할 쿠키를 뽑아내는 작업을 거쳐야 한다. 물론 한글사용을 위해 인코딩한 값으로 쿠키가 저장되어 있기 때문에 쿠키를 사용할 때에도 디코딩하여 쿠키를 사용해야 한다.
Spring MVC에서는 쿠키를 받아오는 작업을 훨씬 쉽게 할 수 있는 어노테이션을 제공한다.
바로 @CookieValue어노테이션이다. 이 어노테이션을 사용하면 원하는 쿠키만을 이름으로 가져와서 주입해주며,
디코딩도 자동으로 해주기 때문에 따로 작업해주지 않아도 된다.
'JAVA > Spring MVC' 카테고리의 다른 글
Message (0) | 2020.04.29 |
---|---|
Properties (0) | 2020.04.28 |
Spring MVC에서의 빈 관리 (ApplicationScope) (0) | 2020.04.28 |
Spring MVC에서의 빈 관리 (SessionScope) (0) | 2020.04.27 |
Spring MVC에서의 빈 관리 (RequestScope) (0) | 2020.04.27 |