네트워크
Cookie와 Session
songu1
2023. 3. 19. 22:11
쿠키와 세션을 사용하는 이유 - HTTP 프로토콜의 특징이자 약점을 보완하기 위해 사용
HTTP 프로토콜의 특징
- Connectionless 프로토콜 (비연결 지향)
클라이언트가 서버에 요청(Request) 했을 때 그 요청에 맞는 응답(Response)을 보낸 후 연결을 끊는 처리방식 - Stateless 프로토콜
커넥션을 끊는 순간 클라이언트와 서버의 통신이 끝나며 상태 정보는 유지하지 않는 특성
🚨 정보가 유지되지 않으면 매번 페이지를 이동할 때마다 로그인을 다시 하거나, 상품을 선택했는데 구매 페이지에서 선택한 상품의 정보가 없거나 하는 등의 일이 발생할 수 있음
⇒ Stateful 경우를 대처하기 위해 쿠키와 세션을 사용
쿠키와 세션의 차이 : 상태 정보의 저장 위치
- 쿠키 : 클라이언트(로컬 pc) 에 저장
- 세션 : 서버에 저장
[1] Cookie
HTTP의 일종으로 사용자가 어떤 웹사이트를 방문할 경우, 그 사이트가 사용하고 있는 서버에서 사용자의 컴퓨터에 저장하는 작은 기록 정보 파일
- HTTP에서 클라이언트의 상태 정보를 클라이언트의 PC에 저장했다가 필요 시 정보를 참조하거나 재사용 할 수 있음
특징
- 이름, 값, 만료일(저장기간), 경로 정보로 구성
- 최소한의 정보만 사용해야함. 보안에 민감한 데이터 포함하면 안됨
- 쿠키 정보는 항상 서버에 전송됨. 쿠키가 많아질수록 네트워크 트래픽이 추가로 발생
- 보안에 매우 취약 → admin의 쿠키값을 가져올 수 있다면 내가 해당 사이트의 admin이 되서 공격이 가능
동작 순서
- 클라이언트가 페이지 요청(사용자가 웹사이트에 접근)
- 웹 서버는 쿠키를 생성
- 생성한 쿠키에 정보를 담아 HTTP 화면을 돌려줄 때, 같이 클라이언트에게 돌려줌
- 넘겨받은 쿠키는 클라이언트가 가지고 있다가(로컬 PC에 저장) 다시 서버에 요청할 때 요청과 함께 쿠키를 전송
- 동일 사이트 재방문 시 클라이언트의 PC에 해당 쿠키가 있는 경우 요청페이지와 함께 쿠키를 전송
사용 예시
- 방문 사이트에서 로그인 시 “아이디와 비밀번호를 저장하겠습니다?”
- 팝업창을 통해 “오늘 이 창을 다시 보지 않기” 체크
- 광고 정보 트래킹
[2] Session
일정 시간동안 같은 사용자(같은 브라우저)로 들어오는 일련의 요구를 하나의 상태로 보고, 그 상태를 일정하게 유지시키는 기술
- 일정시간 : 방문자가 웹 브라우저를 통해 웹 서버에 접속한 시점 ~ 웹브라우저를 종료하여 연결을 끝내는 시점
- 방문자가 웹서버에 접속해 있는 상태를 하나의 단위로 보고 세션이라 칭한다
특징
- 웹 서버에 웹 컨테이너으 상태를 유지하기 위한 정보를 저장
- 웹 서버에 저장되는 쿠키(=세션 쿠키)
- 브라우저를 닫거나, 서버에서 세션을 삭제했을 때만 삭제가 되므로 쿠키보다 비교적 보안이 좋음
- 서버 용량이 허용하는 한에서 저장 데이터에 제한이 없음
- 각 클라이언트에 고유 Session ID를 부여
- Session ID로 클라이언트를 구분해 각 요구에 맞는 서비스를 제공
- Session 객체들마다 저장해둔 데이터를 이용한다
동작순서
- 클라이언트가 페이지 요청(사용자가 웹사이트에 접근)
- 서버는 접근한 클라이언트의 Request-Header 필드인 쿠키를 확인하여 클라이언트가 해당 session-id를 보냈는지 확인
- session-id가 존재하지 않는다면 서버는 session-id를 생성해 클라이언트에게 돌려줌
- 서버에서 클라이언트로 돌려준 session-id를 쿠키를 사용해 서버에 저장
- 클라이언트는 재접속 시 이 쿠키를 이용해 session-id값을 서버에 전달
사용 예시
- 화면을 이동해도 로그인이 풀리지 않고 로그아웃하기 전까지 유지
Spring에서 세션 적용하기
[1] 세션에 데이터 저장 : session.setAttribute(”저장하고자하는 변수명”, 저장변수값);
Controller
@RequestMapping("/test")
public String test(HttpServletRequest request) throws Exception{
HttpSession session = request.getSession();
String name="song";
session.setAttribute("sessionId", name);
return "test/test";
}
View - thymeleaf 템플릿엔진
<body>
<h2 th:text="${sessionId}"></h2>
</body>
[2] 세션에 저장된 데이터 가져오기 : session.getAttribute(”저장한 변수명”);
Controller
@RequestMapping("/test2")
public String test2(HttpServletRequest request) throws Exception{
HttpSession session = request.getSession();
String name=(String) session.getAttribute("sessionId");
System.out.println("세션에 저장된 변수 : "+name);
session.setAttribute("sessionId",name);
return "test/test";
}
View - thymeleaf
<body>
<h2 th:text="${sessionId}"></h2>
</body>
[3] 세션 초기화하기 : session.invalidate();
[3] 쿠키와 세션 비교
https://dev-coco.tistory.com/61