부스트코스 웹 프로그래밍 BE 영상을 보며 공부한 것을 간단히 정리한다.
1. 쿠키와 세션
개념
- 쿠키
- 사용자 컴퓨터에 저장
- 저장된 정보를 다른 사람이나 시스템이 볼 수 있음
- 유효기간이 지나면 사라짐
- 세션
- 서버에 저장
- 서버가 종료되거나 유효기간이 지나면 사라짐
동작 과정
1) 쿠키
2) 세션
구현
1) 쿠키
쿠키는 javax.servlet.http.Cookie
에 (키, 값) 형태로 구현되어 있다.
// 서버에서 쿠키 생성
Cookie cookie = new Cookie(키, 값);
// 클라이언트가 보낸 쿠키 읽기 (방법 1)
Cookie[] cookies = request.getCookies();
if(cookies != null) {
for(Cookie cookie : cookies) {
if("key".equals(cookie.getName())) {
find = true;
value = cookie.getValue();
}
}
}
// 클라이언트가 보낸 쿠키 읽기 (방법 2, Spring MVC)
@CookieValue(value="key", defaultValue="1", required=true) String value
// 쿠키 삭제 요청(0) 혹은 유지 기간 설정. 초 단위.
cookie.setMaxAge(0);
// 경로 이하에 모두 쿠키 적용.
cookie.setPath("/");
// 응답에 쿠키 넣어주기
response.addCookie(cookie);
예를 들어, 다음과 같이 사용이 가능하다.
@GetMapping(path="/list")
public String list(...
@CookieValue(value="count", defaultValue="0", required=true) String value,
HttpServletResponse response) {
// 쿠키가 있는 경우, 없는 경우 처리
try {
int i = Integer.parseInt(value);
value = Integer.toString(++i);
} catch (Exception e) {
value = "1";
}
// 쿠키 갱신하여 Response 에 추가
Cookie cookie = new Cookie("count", value);
cookie.setMaxAge(60*60*24*365); // 1년으로 설정
cookie.setPath("/");
response.addCookie(cookie);
...
}
2) 세션
세션은 javax.servlet.http.HttpSession
에 (키, 값) 형태의 오브젝트로 구현되어 있다.
즉, 쿠키는 단일 키와 값(String)만 담는 반면, 세션은 여러 키로 여러 개의 값(Object)을 담을 수 있음.
// 세션 생성 및 얻기 (방법 1)
// 1) 서버에 생성된 세션이 있다면 세션을 반환하고 없다면 새롭게 세션을 생성하여 반환
HttpSession session = request.getSession();
// 2) 이미 생성된 세션이 있다면 반환하고 없으면 null을 반환
HttpSession session = request.getSession(false);
// 세션 생성 및 얻기(방법 2, Spring MVC)
@SessionAttribute("user") User user
// 세션에 데이터 저장, 삭제
session.setAttribute(키, 값);
session.removeAttribute(키, 값);
// 세션 내 데이터 읽기
String value = (String) session.getAttribute("id"); // 반환 값은 Object 유형
세션 유지 시간은 web.xml
파일에서 설정해야함.
따로 설정하지 않을 경우, 기본 값은 30분임.
<session-config>
<session-timeout>30</session-timeout>
</session-config>
예를 들어 다음과 같이 사용이 가능하다.
@GetMapping("/guess")
public String guess(...
HttpSession session) {
session.setAttribute("count", 0);
session.setAttribute("randomNumber", (int)(Math.random()*100)+1);
...
int count = (Integer)session.getAttribute("count");
int randomNumber = (Integer)session.getAttribute("randomNumber");
...
}
한편, Spring @SessionAttribute
어노테이션을 사용한 예는 다음과 같다.
@GetMapping("/info")
public String userInfo(@SessionAttribute("user") User user) {
...
return "user";
}
'더 나은 엔지니어가 되기 위해 > 지금은 안쓰는 자바' 카테고리의 다른 글
[부스트코스 웹 프로그래밍] 로깅 (0) | 2020.01.24 |
---|---|
[부스트코스 웹 프로그래밍] 인터셉터와 아규먼트 리졸버 (0) | 2020.01.24 |
[부스트코스 웹 프로그래밍] 스프링 MVC (2) | 2020.01.23 |
[부스트코스 웹 프로그래밍] 스프링 JDBC (1) | 2020.01.20 |
[부스트코스 웹 프로그래밍] 스프링과 DI 컨테이너 (0) | 2020.01.19 |