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에 대한 내용을 일일히 작성할 필요가 없다!
'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 |