JSP&Servlet/기초정리

JSP 기초 - 쿠키와 세션

줘니(•̀ᴗ•́)و 2023. 2. 3. 17:50
728x90

1. 쿠키와 세션의 필요성

 

 

 

http 장점이 단점이 되어버림 -> 정보를 유지할 수 없다.

 

 

정보를 유지하기 위해 쿠키와 세션이 필요

 

 

 

 

 

2. 쿠키

: 클라이언트(브라우저)에 저장되는 키와 값이 들어있는 작은 데이터 파일

 

 

아무 웹페이지 들어가 F12를 눌러 개발자 모드를 켠 뒤 Application 파트를 누르면 쿠키와 세션 구조를 확인할 수 있다.

 

 

1) 쿠키 동작방식

 

 

 

2) 쿠키 사용 예시

- ID 저장, 로그인 상태 유지

- 일주일간 다시 보지 않기

- 쇼핑몰 장바구니 기능

 

 

3) 쿠키 단점

- 보안에 취약(F12 누르고 봐도 다 보임)

- 작은 허용 용량

- 브라우저 변경할 경우 다른 브라우저에서 저장한 쿠키 값을 사용할 수 없음

 

 

4) 쿠키 생성과 쿠키 보내기

 

쿠키와 관련된 작업은 java 언어를 활용한다!

이클립스에 jsp 파일을 만들고 실행할 것.

 

쿠키를 생성할 땐 Cookie 객체 사용

Cookie(name, value)로 작성하면 되고, 둘 다 String 타입이다.

 

쿠키에 유효기간을 설정할 수 있고, 유효기간은 초 단위로 설정된다.

 

 

<%
    // 1. 쿠키 생성
	Cookie cookie = new Cookie("test", "firstCookie");
    
    // 2. 쿠키에 유효기간 설정
   	cookie.setMaxAge(60*60*24*365); // 1년 기준으로 셋팅됨
    
    // 3. 완성되 쿠키 클라이언트에게 전달하기
    response.addCookie(cookie);
%>

 

 

웹브라우저를 실행하여 F12 개발자모드로 확인해보면,

test 쿠키가 잘 전달되어 있고, 유효기간 또한 내가 설정한 대로 잘 되어있는 걸 볼 수 있다.

 

 

 

* 쿠키 전달과 동시에 한번에 생성하기

→ 한번에 생성이 가능하지만 유효기간 설정은 생략된다!

 

<%
    response.addCookie(new Cookie("test2", "SecondCookie"));
%>

 

 

5) 다른 페이지에서 쿠키 데이터를 가져와 사용하는 경우

Cookie(name, value)로 구성되어 있어서 값을 가져올 때 이름 따로, 데이터 따로 가져올 수 없다.

하나를 찾아오더라도 꼭 이름과 데이터를 같이 찾아와야 한다. → 배열 사용

Cookie [] cookies = request.getCookies();

 

 

6) 쿠키 삭제

: 쿠키를 삭제하는 메소드는 따로 없다.

- 그래서 쿠키를 새로 생성해야 함(그게 삭제임) → 값이 없는 쿠키 생성

유지기간도 0초로 하여 단 1초라도 없었던 것처럼 ~

 

 

    <%
		Cookie cookie = new Cookie("test", null);
		cookie.setMaxAge(0); // 유지기간 0초!
		
		response.addCookie(cookie);
	%>

 

 

 

3. 세션

: 브라우저가 종료되기 전까지 클라이언트의 정보를 유지하게 해주는 기술

→ 사용자 정보 파일을 서버 측에서 관리

 

 

 

1) 세션 동작방식

: 쿠키랑 같음

 

 

 

 

2) 세션 특징과 사용 예

* 특징

- 각 클라이언트에게 고유 ID를 부여

- 보안 면에서 쿠키보다 우수

- 사용자가 많아질수록 서버 메모리를 많이 차지하게 됨

 

사용 예 : 로그인 같이 보안 상 중요한 작업을 수행할 때 사용

 

 

3) 세션 생성

: 세션은 내장객체를 가지고 있어 cookie처럼 객체를 선언하지 않아도 됨

 

쿠키의 경우 name과 value가 모두 String 타입이었지만,

세션은 session(String, Object);로 value값이 Object 타입이다.

 

<%
    // 1. 세션 값 설정
	session.setAttribute("id", "smart");
	session.setAttribute("pw", 123);
%>

 

 

4) 다른 페이지에서 세션 데이터를 가져와 사용하는 경우

 

① 따로따로 값 가져오기

 

session.getAttribute() 속성을 확인해보면 object 자료형이기 때문에 다운캐스팅 해줘야 함

 

<%
    String id = (String)session.getAttribute("id");
    int pw = (int)session.getAttribute("pw");
    
    id : <%=id %> <br>
    pw : <%=pw %>
%>

 

 

 

 

② 전체적으로 값 가져오기

 

Enumeration을 이용해 전체 값을 가져와 반복문으로 데이터 출력하기

 

<%
	Enumeration names = session.getAttributeNames();
	
	// 이름의 갯수가 몇 개인지 모르므로 while문 사용
	while(names.hasMoreElements()){
		String name = names.nextElement().toString();
		out.print(name + " : ");
		out.print(session.getAttribute(name) + "<br>");
	}
%>

 

 

 

 

5) 세션 삭제하기

 

 removeAttribute(); 사용해 세션 하나씩 삭제하기

 

 

	<%
		session.removeAttribute("id");
	%>

 

 

 

 

"id"가 null값으로 세션 데이터가 삭제된 걸 볼 수 있다.

 

 

하지만,

"pw"를 removeAttribute(); 를 사용해 삭제하는 경우 웹 브라우저에 500 에러가 뜬다!

 

왜냐면 "pw"는 int 타입이기 때문이다!

 

 

무슨 말이냐면,

String형은 레퍼런스(참조)형 데이터 / int형은 기본 데이터 자료형

레퍼런스 자료형은 null값을 담을 수 있지만, 기본 데이터 자료형은 null값을 담을 수 없다.

그래서 String 타입인 "id"는 데이터가 지워지고 null값을 반환하지만,

int 타입인 "pw"은 null값을 반환하지 못해 500에러가 뜨는 것이다!

 

"pw"를 null값으로 반환되게 해주려면?

→ 정수형이면서 null값을 담을 수 있는 객체형으로 변환한다

→ 세션 데이터를 가져올 때 int에서 Integer로 수정해주어야 함

 

 

<%
    // 생성하고 데이터 가져올 때
    Integer pw = (Integer)session.getAttribute("pw");	
%>


<%
    // 세션 삭제
    session.removeAttribute("pw");
%>

 

 

 

 

 세션에 저장된 모든 내용을 한번에 삭제하는 방법

 

<%
    session.invalidate();
%>

 

세션에 있는 모든 key에 대한 내용을 삭제하는 메소드로 key에 대한 내용을 일일히 작성할 필요가 없다!

 

 

 

 

 

728x90

'JSP&Servlet > 기초정리' 카테고리의 다른 글

JSP&Servlet 기초 - Scope  (0) 2023.02.08
JS&Servlet 기초 - 로그인 실습(세션 추가)  (0) 2023.02.07
JSP 기초 - 랜덤 실습  (0) 2023.02.02
JSP 기초 - 내장객체  (0) 2023.02.01
JSP 기초 - 선언문, 지시자  (0) 2023.02.01