New World

[JSP 공부 #2] 쿠키와 세션 본문

Programming/Languages

[JSP 공부 #2] 쿠키와 세션

hyeovi 2020. 6. 29. 22:57
728x90
반응형

Coonnectionless

 

클라이언트                웹 서버
페이지 A         요청에 대해 응답한 후 자동으로 연결이 끊어짐
                    이전 연결 정보는 전혀 없음
페이지 B         이전에 연결 정보는 전혀 없으며 단지 현재의 요청에만 다시 응답 후 연결이 끊어짐

 

 

 


TCP 연결설정 특성

 

 

1. 3way handshake 연결 과정
2. 데이터 전송 과정
3. 4way handshake 종료 과정

 

 

 

 


세션


세션 필요성

프로그램 흐름도

검색 -(web container)-> 요청 -(서블릿의 새로운 스레드에 전달)-> 세션을 찾아 세션 객체 내의 속성 필드에 저장 -(HttpSession A)
후속 질문이 있다면 질문을 사용자에게 보내고 검색부터 다시 시작됨


도중에 다른 사용자가 들어오고 싶어한다면 새로운 연결을 구분해야 다른 사용자가 들어올 수 있는데 이 때 필요한 것이 세션 ID


세션의 특징

고객과 컨테이너 간 세션 ID 교환을 통해 다른 사용자를 알아보기 위함이자 이후 예전에 물어보았던 검색 기록을 되살릴 수 있음
- 세션은 서버의 메모리에 저장되며 서버가 종료되거나 유효시간이 지나면 사라짐
- 클라이언트마다 각기 다른 정보를 서버에 저장


세션 이용
웹 서버에서 세션 정보 조회, 세션 속성 저장, 세션 속성 조회, 기타 세션 관리를 클라이언트와 주고 받음


session 내장 객체 (javax.servlet.http, HttpSession)
long getCreationTime()
현재 세션이 생성된 시간까지 지난 시간을 계산하여 밀리세컨드로 반환
- 현재 세션이 생성된 시간을 1970년 1월 1일 0시를 기준으로 지난 시간을 계산하여 밀리세컨드로 반환
- 년, 월, 일 시의 시간 정보로 출력하려면 클래스 java.util.Date의 생성자  Date(long mseconds)를 이용하여 객체를 만든 후 출력
ex)
long mseconds = session.getCreationTime();
Date time = new Date(mseconds);

int getMaxInactiveInterval()
현재 생성된 세션을 유지하기 위해 설정된 최대 시간을 초의 정수형으로 반환
지정되지 않으면 기본 값은 1800초, 즉 30분이며, 기본값도 서버에서 설정 가능

Object getAttribute(String name)
name이란 이름에 해당되는 속성값을 Object타입으로 반환, 해당되는 이름이 없을 경우에는 null 반환
- 세션에 저장된 자료는 다시 getAttribute(String name)메소드를 이용해 조회
- 반환 값은 Object로 저장된 객체로 자료유형 변환 필요

ex)
String value = (String)getAttribute("name");

Enumeration getAttributeNames(): 속성의 이름들을 Enumeration타입으로 반환
- 세션의 속성으로 지정한 이름을 모두 알기 위해 반환 값은 인터페이스 Enumeration 사용
- 패키지 java.util

- 페이지 지시자의 import 속성을 이용
<%@ page import="java.util.Enumeration, java.util.Date" %>

...
Enumeration<String> e = session.getAttributeNames();

 

Enumeration<String>
- 자료 유형 Enumeration은 여러 개의 내부 원소를 일렬로 저장한 구조를 지원
- 객체 e의 자료 유형은 Enumeration<String>
- <String>의 일반화 유형으로 선언
- e.nextElement()의 반환 값을 저장할 때 String으로 자료유형 변환이 필요 없는 장점

Enumeration 이용
Enumeration<String> e = session.getAttributeNames();

while(e.hasMoreElements()){
String name = e.nextElement();
String value = (String)session.getAttribute(name);
out.println("세션 name : " + name);
out.println("세션 value : " + value);
}

void invalidate(): 현재 생성된 세션을 무효화 시키며 다시 페이지를 refresh하면 항상 세션 ID와 생성시간이 바뀜
ex) <% session.invalidate(); %>

 

void setAttribute(String name, Object value): name으로 지정한 이름에 value 값 할당
- name과 value의 쌍으로 객체 Object를 저장하는 메소드
- 세션이 유지되는 동안 저장할 자료를 저장
ex) session.setAttribute("name", "value");

 

void removeAttribute(String name): name으로 지정한 속성값 제거

String getId(): 세션에 할당된 유일한 식별자를 String 타입으로 반환

boolean hasMoreElements(): enumeration의 내부에 더 이상의 원소가 있는지 결과 반환, 있다면 true 없다면 false
Object nextElement(): enumeration의 내부에 더 이상의 원소가 있다면 다음 원소를 반환
void setMaxInactiveInterval(int interval): 세션의 최대 유지시간을 초 단위로 설정
boolean isNew(): 세션이 새로이 만들어졌으면 true, 이미 만들어진 세션이면 false 반환


세션의 주요 정보 조회
세션은 클라이언트가 서버에 접속하는 순간 생성
- 특별히 지정하지 않으면 세션의 유지 시간은 기본 값으로 30분 설정
- 세션의 유지 시간이란 서버에 접속한 후 서버에 요청을 하지 않는 최대 시간
- 30분 이상 서버에 전혀 반응을 보이지 않으면 세션이 자동으로 끊어짐
- 세션 유지 시간은 서버에서 설정 가능
ex)
<session-config>
<session-timeout>세션 유지 시간 int형</session-timeout>
</session-config>


쿠키


쿠키

- 세션: 후속 request의 또 다른 헤더값
- 사용자 컴퓨터에 저장
- 서버에서 만들어진 작은 정보의 단위
- 서버에서 클라이언트의 브라우저로 전송되어 사용자의 컴퓨터에 저장
- 클라이언트의 정보를 클라이언트 PC에 저장
- 저장된 쿠키는 다시 해당하는 웹 페이지에 접속할 때, 브라우저에서 서버로 쿠키를 전송
- 쿠키는 이름, 값으로 구성된 자료를 저장 (주석, 경로, 유효기간, 버전, 도메인과 같은 추가적인 정보 저장)
- 유효시간이 지나면 사라짐
- 하나의 쿠키는 4K Byte 크기로 제한
- 브라우저는 각각의 웹 사이트 당 20개의 쿠키를 허용
- 모든 웹 사이트를 합쳐 최대 300개 허용
- 클라이언트 당 쿠키의 최대 용량은 1.2M Byte


쿠키의 이용
1. 쿠키 생성, 저장: 웹 서버에서 클라이언트로 보냄
2. 쿠키 조회: 클라이언트에서 웹 서버에 쿠키 조회 요청


쿠키 클래스(javax.servlet.http.Cookie 클래스)

int getMaxAge(): 쿠키의 최대 지속 시간을 초단위로 지정, -1일 경우 브라우저가 종료되면 쿠키는 만료
String getName(): 쿠키의 이름을 스트링으로 변환
String getValue(): 쿠키의 값을 스트링으로 변환
void setMaxAge(int expiry): 쿠키의 만료 시간을 초단위로 설정
void setValue(String newValue): 쿠키에 새로운 값을 설정할 때 사용

 

쿠키 추가
- 쿠키 생성: 쿠키는 (이름, 값)의 쌍 정보를 입력하여 생성
- 쿠키의 이름은 알파벳과 숫자로만 구성되고 쿠키의 값은 공백, 괄호, 등호, 콤마, 콜론, 세미콜론 등은 포함 불가능
ex) Cookie cookie = new Cookie("name","value");

쿠키의 유효기간 설정
메소드 setMaxAge() : 인자는 유효기간을 나타내는 초 단위의 정수형
0, 쿠키의 삭제
음수, 브라우저가 종료될 때 쿠키 삭제
ex)cookie.setMaxAge(2*60);
1주일로 지정하려면 (7*24*60*60)  => 7일, 24시간, 60분, 60초

클라이언트의 컴퓨터에 파일 형태로 저장
- 내장 객체 response의 addCookie 메소드 이용
ex) response.addCookie(cookie);

쿠키 조회: 클라이언트에 저장된 쿠키를 조회
- 내장 객체 request의 getCookies() 메소드 이용
- 메소드 getCookies()의 반환 값은 저장된 모든 쿠키의 배열(쿠키가 없으면 null값 반환)
ex) Cookie[] cookies = request.getCookies();

각각의 쿠키를 얻는 방법: 쿠키 배열 변수 cookies는 for each문 사용
for(Cookie c : cookies){
          out.println("쿠키 이름(name):"+c.getName()+",";
          out.println("쿠키 값(value) : " + c.getValue() +"<br>");
}

컨테이너에서 해주는 일
RESPONSE에서 세션 쿠키를 보낼 때
HttpSession session = request.getSession();
- 새로운 HttpSession 객체를 생성 X
- 고유한 세션 ID 만드는 것 X
- 새로운 쿠키 객체 X
- 세션 ID와 쿠키 연관성 찾는 것 X
- response 안에 쿠키 삽입하는 것 X

REQUEST로부터 세션 ID를 받을 때
HttpSession session = request.getSession();
- if (REQUEST에 세션 ID 쿠키가 들어있음){

             그 ID에 해당하는 세션 찾기

}
else if(세션 ID 쿠키 없음 또는 그 ID에 맞는 활성 세션 없음){

             새로운 세션 만들기

}

쿠키와 세션의 필요성
- HTTP의 비연결성을 보완
- 여러 페이지로 이동하더라도 사용자의 정보와 필요 정보 유지 필요

 

반응형
Comments