반응형
Cookie & Session
- HTTP 프로토콜은 상태가 유지되지 않는 프로토콜
- 상태 유지를 위해 Cookie, Session 같은 기술이 등장함
- Cookie는 상태 정보를 클라이언트에 저장
- Session은 상태 정보를 서버에 저장
Cookie
- 클라이언트 단에 저장되는 작은 정보 단위
- 클라이언트에서 생성, 저장 가능
- 서버에서 전송한 쿠키를 클라이언트에 저장 가능
- name, value, comment, path, maxage, version, domain 등을 지정할 수 있음
- 쿠키의 이름은 알파벳과 숫자만 허용
- 하나의 쿠키는 4K byte의 크기 제한이 있음
- 웹사이트당 20개의 쿠키를 허용
- 모든 웹사이트 합쳐서 300개의 쿠키 허용
Cookie 생성
@PostMapping("/api/cookies")
public void addCookies(HttpServletResponse response) {
Cookie cookie = new Cookie("test_key", "test_value");
cookie.setMaxAge(60 * 60 * 24); // 24시간 유지, 음수일 경우 브라우저 종료시까지 유지
cookie.setPath("/"); // 하위 경로 전체에 쿠키 적용
response.addCookie(cookie);
}
Cookie 조회
@GetMapping("/api/cookies")
public void getCookies(HttpServletRequest request) {
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
log.info("name : {}, value : {}", cookie.getName(), cookie.getValue());
}
}
}
@GetMapping("/api/cookies")
public void getCookies(@CookieValue(name = "test_key", required = false, defaultValue = "") String testValue) {
log.info("testValue : {}", testValue);
}
Cookie 삭제
@DeleteMapping("/api/cookies")
public void removeCookies(HttpServletResponse response) {
Cookie cookie = new Cookie("test_key", null);
cookie.setMaxAge(0);
response.addCookie(cookie);
}
Session
- 상태 정보를 서버에 저장하는 방식
- 서버 종료시 세션 삭제됨
- 서버는 클라이언트를 식별하는 session id를 생성해 쿠키 형태로 클라이언트에 저장
- 클라이언트의 요청시 session id를 가지고 상태 정보를 활용하여 처리
Session 생성
@PostMapping("/api/sessions")
public void addSession(HttpServletRequest request) {
HttpSession session = request.getSession();
session.setAttribute("test_key", "test_value");
session.setMaxInactiveInterval(60 * 60 * 24); // 24시간 유지, 디폴트는 30분
log.info("isNew : {}", session.isNew());
}
@PostMapping("/api/sessions")
public void addSession(HttpSession session) {
session.setAttribute("test_key", "test_value");
session.setMaxInactiveInterval(60 * 60 * 24); // 24시간 유지, 디폴트는 30분
log.info("isNew : {}", session.isNew());
}
Session 조회
@GetMapping("/api/sessions")
public void getSession(HttpSession session) {
log.info("id : {}", session.getId());
log.info("value : {}", session.getAttribute("test_key"));
log.info("생성 시간 : {}", session.getCreationTime());
log.info("세션 유지 시간 : {}", session.getMaxInactiveInterval());
}
@GetMapping("/api/sessions")
public void getSession(@SessionAttribute("test_key") String value) {
log.info("value : {}", value);
}
Session 삭제
@DeleteMapping("/api/sessions")
public void removeSession(HttpSession session) {
session.removeAttribute("test_key");
// session.invalidate(); // 전체 삭제
}
Redis로 Session Clustering하기
- pom.xml
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency>
- application.properties
spring.redis.host=redis.example.com spring.redis.port=6379
- App
@EnableRedisHttpSession @SpringBootApplication public class SpringExampleApplication { public static void main(String[] args) { SpringApplication.run(SpringExampleApplication.class, args); } }
- Controller
@PostMapping("/api/sessions") public void addSession(HttpSession session) { session.setAttribute("test_key", "test_value"); session.setMaxInactiveInterval(60 * 60 * 24); // 24시간 유지, 디폴트는 30분 log.info("isNew : {}", session.isNew()); }
- redis
127.0.0.1:6379> keys * 1) "spring:session:sessions:expires:023eb12e-fb36-41e2-865f-3e56ac58ac61" 2) "spring:session:sessions:be6d312b-9c6c-4a4f-b241-ed317180efbc" 3) "spring:session:sessions:023eb12e-fb36-41e2-865f-3e56ac58ac61" 4) "spring:session:expirations:1606274340000" 5) "spring:session:sessions:expires:be6d312b-9c6c-4a4f-b241-ed317180efbc" 6) "spring:session:expirations:1606358880000"
127.0.0.1:6379> hgetall spring:session:sessions:be6d312b-9c6c-4a4f-b241-ed317180efbc 1) "maxInactiveInterval" 2) "\xac\xed\x00\x05sr\x00\x11java.lang.Integer\x12\xe2\xa0\xa4\xf7\x81\x878\x02\x00\x01I\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x01Q\x80" 3) "creationTime" 4) "\xac\xed\x00\x05sr\x00\x0ejava.lang.Long;\x8b\xe4\x90\xcc\x8f#\xdf\x02\x00\x01J\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\x01u\xfd4\xa8\xc0" 5) "sessionAttr:key1" 6) "\xac\xed\x00\x05t\x00\x05hello" 7) "lastAccessedTime" 8) "\xac\xed\x00\x05sr\x00\x0ejava.lang.Long;\x8b\xe4\x90\xcc\x8f#\xdf\x02\x00\x01J\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\x01u\xfdL\xcbS" 9) "sessionAttr:test_key" 10) "\xac\xed\x00\x05t\x00\ntest_value"
반응형
'Development > Spring' 카테고리의 다른 글
[Spring] Transactional (0) | 2020.12.27 |
---|---|
[Spring] AOP (0) | 2020.12.27 |
[Spring] Cache (with Redis) (0) | 2020.12.27 |
[Spring] Swagger (0) | 2020.12.27 |
[Spring] Argument Resolver (0) | 2020.12.27 |