반응형

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

+ Recent posts