웹(세션)

제이·2023년 5월 3일
0

목록 보기
15/15
post-thumbnail

이력서 -> 결과물 -> 포트폴리오(담당파트)스크린샷은 너무 많이 붙이면 안된다. 웹 관련된 것은 crud 4개가 있어야 한다. 화면만 만들어서 캡쳐해서 넣어도 된다. 프로토콜 엑셀파일캡쳐하기.


클라이언트와의 대화2 : 세션⭐⭐⭐

session 기본 객체

세션 : 클라이언트 상태를 서버측에서 관리하는 거.
서버 영역 저장공간 = 서버측의 데이터 보관소

쿠키와의 차이점은 세션은 브라우저가 아니라 서버에 값을 저장한다는 점이다.
http프로토콜은 계속 유지하는게 아니라, 연결했다 끊겼다를 반복한다.
그래서 상태정보를 저장할 수 없다. 이전에 클라이언트들이 뭘 했는지 어떤 일을 해왔는지 어떤 정보를 가졌는지를 모른다.
그래서 '상태유지'를 위해서 사용되는 방법이 '세션'이다.
세션은 브라우저가 시작과 종료를 나타냄.

브라우저는 정보를 저장할 때 쿠키사용, 세션은 웹 컨테이너에 정보를 보관할 때 사용.
세션은 오직 서버에서만 생성된다.
클라이언트가 뭘 했는지에 대한 정보를 담당.
클라이언트(브라우저) 당 한개씩 세션이 할당된다.
(클라이언트 담당하는 스레드같은 느낌. 저장소 같은 거.)
쿠키와 마찬가지로 세션도 생성해야만 정보를 저장할 수 있다.

세션 생성하기

<%@ page session="true"%>
true가 기본 값이다. false를 하는 걸 본 적이 없다. 걍 무조건 true.
위에 처럼 적으면 세션이 생성된다.
브라우저가 처음 접속할 때 세션을 생성하면 이후로는 이미 생성된 세션을 사용한다.

세션 기본객체

세션 사용한다 = session 기본 객체를 사용한다
session 기본 객체는 속성을 제공해서
setAttribute(), getAttribute()를 사용해서 속성값을 저장하고 읽어올 수 있다.

session 메서드

  • getId() : id구하기
  • getCreationTime() : 클라이언트가 나에게 첫 요청을 날린 시간 - 바뀌지않는다. 단위 : 1/1000초
  • getLastAccessedTime() : 마지막 요청을 날린 시간 - 마지막 요청시간이라서 바뀐다. : 1/1000초

각각의 브라우저마다가 갖는 세션을 구분하기 위해서(사용자를 구분하기 위해서) 세션마다 고유 ID를 할당하는데 그 아이디를 세션ID라고 한다.
서버가 브라우저에게 세션id를 전송하면 브라우저가 쿠키에 세션id를 저장.
그리고 브라우저가 서버에 많은 세션들 중에서 어떤게 내 세션인지 찾을수 있는 세션ID를 요청헤더 넣어서 서버에 보낸다.
그러면 그 아이디를 브라우저가 쿠키에 JSessionID라는 이름으로 세션id를 저장했다가 보내는 거다.
JSessionId : 이 브라우저에게 할당된 세선id같은 거. 세션 식별자.
요청할 때마다 담당하는 세션이 누군지 클라이언트가 보내주는 정보에 의존한다.
쿠키가 차단되어 있으면 로그인을 했음에도 불구하고 다음페이지 가면 로그아웃되어 있고 그럼..

sessionInfo.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@ page session ="true" %>
<%@ page import ="java.util.Date" %>
<%@ page import ="java.text.SimpleDateFormat" %>
<%
	Date time = new Date();
	SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>세션 정보</title>
</head>
<body>
세션ID : <%= session.getId() %><br>
<%
	time.setTime(session.getCreationTime());
%>
세션시간 : <%=formatter.format(time) %><br>
<%
	time.setTime(session.getLastAccessedTime());
%>
최근 접근시간: <%=formatter.format(time) %>
</body>
</html>

<결과>

기본객체 속성 사용

한 번 생성된 세션은 지정한 유효 시간동안 유지.
세션은 데이터 저장소 같은 거. 세션은 내부자원이 아니니까 읽고 쓸 때 훨씬 더 부담이 없다.
특히, 사용자의 id같은 것들, 로그인 후에 글쓰기할 때 글쓰는 정보들이 들어간다.
그래서 여러사이트 같은 데 id가 쓰이면 그걸 세션에 넣어두면 된다.

쿠키 vs 세션

세션의 값은 오직 서버에만 저장.
세션은 쿠키 설정 여부와 관계없이 사용할 수 있다.
하지만 세션은 여러 서버에서 공유할 수 없다.

세션 종료⭐⭐

session.invalidate() : 세션을 종료시키는 메서드.
세션객체가 없어진 게 아니다. invalidate()되면 속성에 접근할 수 없게 된다는 뜻이다.
set,getAttribute()가 안된다.
새로세션이 만들어지는 장소는 invalideate()한 페이지가 아니라
그 다음 페이지에서 다음요청에서 새롭게 생성된다.

그럼 새로운 세션이 생기는 다음페이지 가서 뭔가를 해야한다. 하지만, 다음 페이지에 얻을 세션을 미리 구할 수 있다.
request.getSession()를 쓰면 미리 할 수 있다. invalidate()와 같이 기억하기.

세션을 종료하면 현제 사용중엔 session 기본 객체를 삭제하고 session 기본 객체에 저장했던 속성 목록도 함께 삭제한다.

closeSession.jsp

sessionInfo를 열고 closeSession을 연 후에 sessionInfo를 열면 그 전의 세션이 종료되고, 새로운 세션이 생성되는 걸 볼 수 있다.

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
   <% 
   session.setAttribute("myName", "myValue");
   	out.println("before:" + session.getId());
   
   session.invalidate(); //이걸 한다고 해서 세션이 사라지는 게 아니라는 얘기다. 
   //새로세션이 만들어지는 장소는 인벨리데이트페이지가 아니라 
   //그 다음 페이지에서 다음요청에서 새롭게 생성된다는 얘기다. 
  	out.println("arter:" + session.getId()); 
   // 세션객체가 없어진 게 아니다. 
  	//인벨리디트 되면 속성에 접근할 수 없게 된다. get이 안되면 set도 안된다. 
  	//다음페이지 가서 뭔가를 해야한다. 새로운 세션이 생기니까. 
    //다음 페이지에 얻을 세션을 미리 구할 수 있다.
  	session = request.getSession();
    // 이아이를 쓰면 미리 할 수 있다. invalidate()와 같이 기억하기.
  	
  	 out.println("<br>");
   out.println(session.getAttribute("myName"));
   out.println("<br>");
   out.println("new :" + session.getId());
   out.println("<br>");
   %>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>세션종료</title>
</head>
<body>
세션을 종료하였습니다.

</body>
</html>

세션 유효 시간

마지막 요청을 날린 거 기준(session.getLastAccessedTime())으로 시간을 잡고, 30분(예시)이 지나고 아무런 요청을 안하면 그냥 다른 곳에 갔다고 생각하고 그 전 사이트의 session을 삭제한다. 그러면 로그아웃되어있을 것이다.

설정시간 2가지 방법
1.web.xml에서 <session-timout>태그를 사용 : 단위는 '분'단위
2.setMaxInactiveInterval() 메서드 사용 : 단위는 '초'단위

request.getSession()⭐⭐⭐

서블릿 나중에 할 때, service()안에는 request와 response가 기본객체로 있는데,
이때 request에서 session객체를 구하고 session에서 application객체를 구할 수 있다.
request.getSession() 메서드는 session이 invalidate()되었느냐의 문제이다.
invalidate()되지 않았으면 session을 리턴하고, invalidate()되었으면 새롭게 session을 생성한다!

getSession() = getSession(true)


세션을 사용한 로그인 상태 유지

어제 쿠키대신 세션을 넣은 느낌.

sessionLogin.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%
	String id = request.getParameter("id");
	String password = request.getParameter("password");
	
	if(id.equals(password)){
		session.setAttribute("MEMBERID", id);
	
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>로그인성공</title>
</head>
<body>
로그인에 성공했습니다.
</body>
</html>
<%
	}else {//로그인실패시
%>
<script>
alert("로그인에 실패하였습니다.");
history.go(-1);
</script>
<%
	}
%>

sessionLoginForm.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>로그인폼</title>
</head>
<body>
<form action="<%= request.getContextPath() %>/member/sessionLogin.jsp" method="post">
아이디<input type="text" name="id" size="10"/>
암호 <input type="password" name="password" size="10"/>
<input type="submit" value="로그인">
</form>
</body>
</html>

sessionLoginCheck.jsp

멤버id의 유무를 판단. 뭐인지 판단X.

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%
	String memberId =(String)session.getAttribute("MEMBERID");
	boolean login = memberId == null ? false:true;
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>로그인 여부 검사</title>
</head>
<body>
<%
	if(login) {
%>
	아이디"<%=memberId %>"로 로그인한 상태
<%
	}else {
%>
	로그인하지 않은 상태
<%
	}
%>
</body>
</html>

<결과>

서블릿컨텍스트와 세션

논리적이든 물리적이든 분리가 되면 그냥 다른 것이다.
같은 application에서만 공유된다. 같은 서버에 있다고 해서 같은 세션이 아니다.

profile
Hello :)

0개의 댓글