[스프링] 쿠키 & 세션 이론

SOLEE_DEV·2023년 2월 25일
0

Spring

목록 보기
2/8
post-custom-banner

1. servlet-context.xml

  • in spring > appServlet > servlet-context.xml
<view-controller path="/register/add" view-name="registerForm" />
// 해당 소스는 get 요청밖에 처리를 못함

2. redirect vs forward 차이

  • redirect : 다른 url 주소로 이동
  • forward : 같은 url에서 화면만 변화
    ※ redirect와 달리 forward는 요청이 하나

2) redirect는 302 / forward는 200

3. 쿠키

1) 정의 : 클라이언트를 구분하기 위한 기술 (식별)

  • 서버는 클라이언트를 모르니 경우에 따라서, 클라이언트를 구분해야 되는 경우가 있음! (쿠키를 사용)

2) 설명

  • 이름과 값의 쌍으로 구성된 작은 정보. (name - value)
  • 유효기간도 존재 (Max-Age)
  • 아스키 문자만 가능
    - ;, 공백 문자열 저장 x
    • 한글 URL 인코딩
  • 서버에서 생성 후 전송, 브라우저에 저장 (유효기간 이후 자동 삭제)
  • 서버에 요청시 domain, path(하위경로 포함)가 일치하는 경우에만 자동 전송!
ex)
Domain : fastcampus.co.kr
path : /ch2/login

3) 동작 과정
(1) 브라우저 -(요청)-> 서버
* 이 때, domain, path 일치
(2) 서버에서 쿠키를 생성 (response.addCookie(cookie))

  • in java
Cookie cookie = new Cookie("id", "asdf");
response.addCookie(cookie);
  • 응답 헤더 (response header) & 쿠키 전달
HTTP/1.1 200
Set-Cookie: id=asdf
Content-Type: text/html; charset=UTF-8
Content-Language: ko-KR
Content-Length: 175
Date: Mon, 15 Nov 2021 07:50:09 GMT

(3) 클라이언트가 쿠키를 받아서 브라우저에 저장!
(4) 최초에 쿠키를 받게 되면 이후 요청은 쿠키와 함께 전달

  • 요청 헤더 (request header)
POST /ch2/login/login HTTP/1.1
Host: localhost
Connection: keep-alive
Content-Length: 26
Cache-Control: max-age=0
Cookie: id=asdf; JSESSIONID=2F460A779BD0DD7339FB68220B814B75
  • 서버 == 도서관 ID카드!

4) 쿠키 생성방법

Cookie cookie = new Cookie("id","asdf"); // 쿠키 생성
cookie.setMaxAge(60*60*24);              // 유효기간 설정(초)
response.addCookie(cookie);              // 응답에 쿠키 추가
  • 유효기간 (브라우저마다 상이! / 전세계, 하드웨어마다 설정된 시간이 상이할 수도 있으니!)
    - max-age : 상대시간
    • Expries=True, 절대시간

5) 쿠키 삭제방법

Cookie cookie = new Cookie("id",""); // 변경할 쿠키와 같은 이름 쿠키 생성
cookie.setMaxAge(0);                 // 유효기간을 0으로 설정(삭제)
response.addCookie(cookie);          // 응답에 쿠키 추가

6) 쿠키 변경방법

Cookie cookie = new Cookie("id","");       // 변경할 쿠키와 같은 이름 쿠키 생성
cookie.setValue(URLEncoder.encode("이솔")); // 값 변경
// 쿠키 값으로는 아스크코드만 가능하니..!
cookie.setDomain("www.fastcampus.co.kr");  // 도메인 변경
cookie.setPath("/ch2");                    // 경로 변경
cookie.setMaxAge(60*60*24*7);              // 유효기간 변경
response.addCookie(cookie);                // 응답에 쿠키 추가

7) 쿠키 읽어오기

Cookie[] cookies = request.getCookies(); // 쿠키 읽기

for(Cookie cookie : cookies) {
	String name = cookie.getName();
	String value = cookie.getValue();
    
    System.out.println("[cookie]name=%s, value=%s%n", name, value);
}

4. 세션

  1. 정의

    • 서로 관련된 요청들을 하나로 묶음
      - (독립적인 요청들을 하나로 묶은게 세션! = 쿠키 이용)
    • browser마다 개별 저장소(session객체)를 서버에서 제공!
      - (브라우저 - 세션 1:1 관계)
    • "a collection of related HTTP transactions made by one browser to one server"
      - (HTTP 트랜젝션 = 요청 / 응답이 한 SET)
    • 비슷한 요청에 같은 세션이라는 꼬리표를 제공 (그룹화)
    • 같은 세션에 있는 동안 같은 세션저장소를 공유
    • 하나의 세션을 끊는 방법
      - 수동 종료 : Invalidate() = 로그아웃
      - 자동 종료 : Time-out & 새로운 세션 ID 제공
  2. 생성 과정
    1) 브라우저 요청시, 서버는 무조건 Session 객체(저장소)를 만듦
    - 세션 객체마다 sessionId를 가지고 있음
    2) 저장소를 쓸 수 있게 JSESSIONID 쿠키를 만들어서 브라우저에 보냄
    3) 브라우저에 쿠키 저장
    4) 다음 요청부터는 JSESSIONID를 request header에 자동으로 넣어서 보냄!

    = 서버는 응답헤더에 Set-Cookie를 써서 보냄
    = 브라우저에 쿠키가 만들어지고 JSESSIONID가 붙어서 가짐 (브라우저 구분용)
    = JSESSIONID가 일치하는 세션저장소를 사용할 수 있음

  3. 세션 객체 얻기

// 컨트롤러에서 세션저장소 사용하는 방법

HttpSession session = request.getSession();
// 1. 요청 객체로부터 JSESSIONID를 보고 일치하는 것을 찾음
session.setAttribute("id", "asdf");
// 2. 반환값을 보고 해당 세션저장소에 값을 수정함!
  1. 세션과 관련된 메서드
    1) 속성 관련 메서드
  • getAttribute : 지정된 이름의 속성 값 반환
  • setAttribute : 지정된 이름의 속성에 값을 저장
  • removeAttribute : 지정된 이름의 속성 삭제
  • getAttributeName : 기본 객체에 저장된 모든 속성 이름 반환
  • pageContext, request, session, application 모두 다 값을 저장하고 받아올 수 있음 그 때 쓰는 메소드!

2) 메서드

  • getId : 세션 ID 반환
  • getLastAccessedTime : 최근 요청을 받은 시간 반환
  • isNew : 새로 생성된 세션인지 반환
  • invalidate : 세션 종료 (즉시)
  • setMaxInactiveInterval : 예약 종료
  • getMaxInactiveInterval : 예약된 세션 종료 시간을 반환
  1. 세션의 종료
    1) 수동 종료 (초 단위)
HttpSession session = request.getSession();
session.invalidate();                   // 1. 세션 즉시 종료
session.setMaxInactiveInterval(30 * 60) // 2. 예약 종료 (30분 후)

2) 자동 종료 - web.xml (분 단위)

<session-config>
  	<session-timeout>30</session-timeout>
</session-config>

= 세션이 종료되면 새로운 세션ID가 발급됨 (새로운 객체 생성)
= StandardManager가 세션의 생성과 소멸을 관리해줌
= 세션 객체는 서버에 오래 남아있기 쉬우니 부담을 줄이기 위해 많은 것을 저장하면 안됨

  1. 쿠키 vs 세션
    1) 쿠키
  • 브라우저에 저장
  • 서버 부담 X
  • 보안에 불리
  • 서버 다중화에 유리

2) 세션

  • 서버에 저장
  • 서버 부담 O
  • 보안에 유리
  • 서버 다중화에 불리 (세션 객체를 모든 서버에 동기화하는 과정이 필요!)
  1. 쿠키 수집을 허용하지 않는 브라우저 대응 방법
  • 모든 요청마다 URL 뒤에 JSESSIONID를 보내줘야 함 (Get으로!)
  • .jsp 안에 <c:url value=""> = 이 알아서 url뒤에 session id를 붙여서 보내줌
    (이렇게 안하면 매 요청마다 세션객체가 만들어져서 서버 부담이 커짐!)

세션이 없는 첫 번째 요청마다 무조건
1)서버가 url 뒤에 session id를 붙여서 보내줌
2) set cookie로 쿠키로 저장하게끔도 보내줌!
이 후 요청부터는 url 뒤에 session id가 안붙음

profile
Front-End Developer
post-custom-banner

0개의 댓글