today_is

[ jsp ] 로그인 세션 본문

java

[ jsp ] 로그인 세션

ye_rang 2023. 12. 11. 15:19

오늘의 목표

 세션의 특성에 대해서 파악하고, 로그인후에 세션 만료시간을 적용해보자. 

 


 session 

: 세션에 데이터를 저장 가능함

이러한 특성을 이용하여 로그인 지속 기능을 부여할 수 있다 

 

 

session vs cookie

: 세션은 브라우저를 종료할때까지 데이터가 유지된다

쿠키는 세션과 다르게, 브라우저 정리와는 별개로 생존기간동안 데이터가 사라지지 않음

 

 

 

 

 

GET

: 주소창을 통해서 전달하기 때문에 인코딩을 별도로 설정하지 않아도 글자깨짐 현상이 없다

 

POST

: 주소창을 통하지 않아서, 별도의 인코딩 형식을 지정해야 글자를 정상적으로 받을 수 있다

 


파라미터는 request객체에 담겨서 넘어오기 때문에, request의 인코딩규칙을 지정한 후 파라미터를 꺼내기 !

 

 

 

 

 ex01-form.jsp 


form에서 문자열 입력값을 보여주고 싶지 않으면 input의 type="password" 를 사용하자


form에서 method는 GET가 기본값


GET은 전송이 빠르고 직관적이다. 대신 파라미터가 주소창에 노출된다


용량이 많거나, 주소창에 노출시키고 싶지 않거나, 문자열로 표현불가능한 값은 POST로 전달


POST는 입력값을 쿼리스트링으로 전달하지 않는다


POST는 GET에 비해 처리속도가 다소 느리지만, 더 많은 데이터를 전송하는데 사용

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ex01-form.jsp</title>
</head>
<body>

<h1>ex01-form</h1>
<hr>


<legend>POST</legend>


<form action="ex01-action.jsp" method="POST">
	<p><input type="text" name="userid" placeholder="ID" required autofocus></p>
	<p><input type="password" name="userpw" placeholder="Password" required></p>
	<p><input type="submit" value="로그인"></p>
</form>

</body>
</html>

 

ex01-form


POST

 

 ex01-action.jsp 

 

String userid = request.getParameter("userid") 

String userpw = request.getParameter("userpw") 

: userid, userpw 변수에 값을 넣는다 

 

즉, ex01-form 에서 기입한 userid , userpw 값을 

getParameter 로 전달받아서 변수로 저장해서 쓰는 것 ! 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ex01-action.jsp</title>
</head>
<body>

<h1>ex01-action</h1>
<hr>
<%

	request.setCharacterEncoding("UTF-8");

	String userid = request.getParameter("userid");
	String userpw = request.getParameter("userpw");
	
	String encoding = request.getCharacterEncoding();
	
%>
<h3>userid : <%=userid %></h3>
<h3>userpw : <%=userpw %></h3>
<h3>encoding : <%=encoding %></h3>

<table border="1" cellpadding="10" cellspacing="0">
	<thead>
		<tr>
			<th>request method</th>
			<th>parameter</th>
			<th>SQL</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>GET</td>
			<td>-</td>
			<td>select * from ...</td>
		</tr>
		<tr>
			<td>GET</td>
			<td>queryString</td>
			<td>
				select * from ... where id = {queryString}<br>
				delete from ... where id = {queryString}<br>
			</td>
		</tr>
		<tr>
			<td>POST</td>
			<td>form-data</td>
			<td>
				insert into ... values ({form-data })<br>
				update ... set column = {form-data }<br>
			</td>
		</tr>
	</tbody>
</table>



</body>
</html>

 

 

 

 

 ex02-form.jsp 

: login 이 null 일때는 form 이 나와서 로그인을 유도한다

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ex02-form.jsp</title>
</head>
<body>

<h1>ex02-form</h1>
<hr>
<%
	String login = (String) session.getAttribute("login");

	if(login == null) {
%>
<form method="POST" action="ex02-action.jsp">
	<p><input type="text" name="userid" placeholder="ID" required autofocus></p>
	<p><input type="password" name="userpw" placeholder="Password" required></p>
	<p><input type="submit" value="로그인"></p>
</form>
<%
	}
	else {
		long last = session.getLastAccessedTime() / 1000;
		long current = new java.util.Date().getTime() / 1000;
%>
<h3>현재 로그인 계정 : 				<%=login %></h3>
<h3>세션 최대 유효 시간 : 			<%=session.getMaxInactiveInterval() %></h3>
<h3>마지막으로 세션에 접근한 시간 : 	<%=last %></h3>
<h3>현재 시간 : 					<%=current %></h3>
<h3>현재시간 - 마지막접근시간 : 		<%=current - last %></h3>
<h3>현재 세션의 고유 ID : 			<%=session.getId() %></h3>
<h3>세션 최대 유효시간은 요청을 보낼때 마다 새로 갱신되어 연장된다</h3>

<a href="ex02-logout.jsp"><button>로그아웃</button></a>
<%	
	}
%>
</body>
</html>

 

 

 

 ex02-action.jsp 

: 로그인을 위한 계정을 미리 만들어둔다 !

 

login 이라는 이름으로 세션을 저장

session.setAttribute("login", name); 

 

세션 유효시간은 최대 300
session.setMaxInactiveInterval(300); 

 

ex02-form 으로 리다이렉트
response.sendRedirect("ex02-form.jsp");

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ex02-action.jsp</title>
</head>
<body>
<%!
	String[] idArray = 		{"test",  	"admin", 	"itbank"};
	String[] pwArray = 		{"1234",  	"1", 		"it"};
	String[] nameArray = 	{"테스트", 	"관리자", 	"홍길동"};
	
	public String login(String userid, String userpw) {
		String name = null;
		for(int i = 0; i < 3; i++) {
			if(idArray[i].equals(userid)) {
				if(pwArray[i].equals(userpw)) {
					name = nameArray[i];
					break;
				}
			}
		}
		return name;
	}
%>
<%
	request.setCharacterEncoding("UTF-8");

	String userid = request.getParameter("userid");
	String userpw = request.getParameter("userpw");
	
	String name = login(userid, userpw);
	
	if(name != null) {
		session.setAttribute("login", name);	// 세션에 원하는 이름으로 객체를 저장한다
		session.setMaxInactiveInterval(300);	// 세션의 최대 유효시간을 300초로 설정한다
		
		response.sendRedirect("ex02-form.jsp");
	}
%>

<script>
	alert('일치하는 계정을 찾을 수 없습니다')
	history.go(-1)	// history.back()
</script>

</body>
</html>

 

 


study_review

오늘은 세션에 대해서 중점적으로 알아보았다.

 

가끔씩 웹 사이트를 이용하다가 '로그인 세션 만료' 라는 문구를 본적이 있었는데

그때 사용되는 세션을 직접 간단하게 사용해볼 수 있어서 흥미로웠다.

 

또한 비전공자인 나에게 다소 생소했던 '쿠키'는 

광고 7일간 표시하지 않기 , 내 계정에서 쿠키 삭제 하기 등등 

일상에서 자주 봤던 기능들이 알고보니 이 쿠키에서 비롯한 것들이라니 너무 신기하다