일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 |
- DV
- 카테캠
- git
- 함수형 언어
- typeorm
- Github
- 개발/kurento
- 개발/언어론
- 개발/OOP
- 명령형 언어
- 개발
- 개발/git
- 개발/네트워크
- java
- 개발/Java
- 가독성
- ⌨️Developer/보안
- 카카오테크캠퍼스
- 개발/컴퓨터네트워크
- 카카오 테크 캠퍼스
- ⌨️Developer
- 개발/프밍론
- typescript
- ospf
- 🎧SoundEngineer
- 개발/보안
- 개발/프레임워크&라이브러리
- 개발/webrtc
- 개발/에러
- 개발/환경
- Today
- 11
- Total
- 13,496
범슈의 연구실
Session 개요 with Spring 본문
Session 개요 with Spring
세션은 사용자의 상태와 데이터를 여러 관련 HTTP 트랜잭션(거래)에 걸쳐 유지하기 위한 메커니즘입니다
세션은 Cookie처럼 여러 HTTP 트랜잭션을 아우를 수 있어, 동일한 브라우저에서의 일련의 요청과 응답을 그룹화 할 수 있습니다
이를 통해 서버는 사용자의 상호작용을 기억하고 웹 애플리케이션을 탐색하는 동안 상태를 유지하게 됩니다
Spring에서는 standard manager가 세션 객체를 만들고 삭제 등의 관리를 합니다
하지만, 세션 저장소의 편리함의 이면에는 서버 부담이 존재하기 때문에 유의해서 사용해야 합니다.
핵심 원리
세션을 인식하는 방법은 간단합니다. 오고가는 HTTP 트랜잭션에 세션 ID를 붙이면 되죠
세션 ID를 붙임으로써 원래 요청과 응답은 별개인데, 이제 요청과 응답마다 세션으로 묶어 사용할 수 있습니다
세션의 ID는 HTTP 헤더의 JESSIONID과 동일합니다
서버는 'JSESSIONID’를 사용하여 사용자의 세션을 조회하고 세션에 저장된 모든 데이터를 검색합니다.
세션 다루기
@Controller
@RequestMapping("/session")
public class SessionController {
@GetMapping("/create")
public String createSession(HttpSession session) {
session.setAttribute("myAttribute", "안녕, 세션!");
return "세션 속성 'myAttribute'가 생성되었습니다.";
}
@GetMapping("/get")
public String getSessionAttribute(HttpSession session) {
String myAttribute = (String) session.getAttribute("myAttribute");
return myAttribute != null ? "세션 속성 'myAttribute': " + myAttribute : "속성을 찾을 수 없습니다.";
}
@GetMapping("/remove")
public String removeSessionAttribute(HttpSession session) {
session.removeAttribute("myAttribute");
return "세션 속성 'myAttribute'가 제거되었습니다.";
}
}
위의 코드에서 getAttribute,removeAttribute,setAttribute 메소드로 세션 객체(저장소)에 쿠키 등의 데이터를 다룰 수 있습니다.
이 때 저장된 데이터들은 key-value 형태로 다뤄지게 됩니다
세션의 종료
세션의 종료 방법에는 수동 종료와 자동 종료가 있습니다.
수동 종료
@Controller
public class SessionController {
@GetMapping("/logout")
public String logout(HttpSession session) {
session.invalidate();
return "You have been successfully logged out.";
}
}
invalidate()
로 세션을 직접 즉시 종료 할 수 있습니다
그 외의 방법으로는 setMaxInactiveInterval(초 단위 시간)
로 예약 종료도 가능합니다
자동 종료
자동 종료는 web.xml 파일을 조작하면 됩니다. 이 때는 수동 종료와 다른게 분 단위 시간을 입력해야 합니다
<session-config>
<seesion-timeout>30(분)</session-timeout>
</session-config>
쿠키 VS 세션
서버 부담 측면
일반적인 세션에서 클라이언트는 해당 클라이언트에 대한 고유한 세션 ID를 생성하는 서버에 요청을 보냅니다.
이 세션 ID는 클라이언트로 다시 전송됩니다(종종 쿠키로)
반면 서버는 일반적으로 메모리에 각 활성 세션 ID를 해당 세션 데이터에 매핑하는 데이터 구조를 유지합니다.
이는 서버의 부담으로 이어지죠
서버 다중화 측면
세션은 서버 다중화, 즉 여러 서버 인스턴스가 배포된 환경에서 불리합니다
왜냐하면, 세션이 기본적으로 서버의 메모리에 저장되기 때문입니다.
A 서버의 메모리에 저장된 메모리를 B 서버도 알아야하기 때문에 동기화나 이에 따른 오버헤드 등의 문제가 있습니다
부족한 점이나 잘못 된 점을 알려주시면 시정하겠습니다 :>
'DEV > Backend' 카테고리의 다른 글
대용량 시스템 아키텍처 (0) | 2023.06.01 |
---|---|
서버의 스케일 업과 스케일 아웃 (0) | 2023.06.01 |
Cookie (0) | 2023.05.25 |
Error Cannot find module socket.io (0) | 2023.05.17 |
Coturn 시그널링 서버 설치 (0) | 2023.05.15 |