JSP(세션, 로그인)

최동민·2022년 6월 28일
0

JSP

목록 보기
10/10

아이디랑 비밀번호를 저장시키는 쿠키를 배웠다면 오늘은 세션에 대해 알아보자.

login.jsp

소규모 프로젝트는 서버를 하나만 두어도 서버가 다운되는 현상이 크게 없을 수 있다.
서버를 여러개 두지 않고 하나만 쓸 때에 세션을 사용

서버를 나누게 되었을 때, 여기 서버에 저장하면 다른 서버에서 받을 수 없다. 그럴 때 토큰이란 걸 사용한다.

쿠키는 로컬에 저장되고, 서버가 실행되며 로컬에 있는 쿠키의 세션id와 세션에서 기억하고 있는 세션id가 비교가 되며 그 쿠키를 사용했었다.

세션(Seesion)

내장 객체로서 브라우저마다 한 개씩 존재하고, 고유한 SessionID를 생성 후 정보를 추출한다.

장단점

JSP에서만 접근할 수 있기 때문에 보안성이 좋고, 저장 용량의 한계가 거의 없다.
일반pc는 한 명, 서버pc는 다양한 사용자가 거쳐가기에 용량 자체도 커야하고 메모리도 커야하는데, 즉 용량 자체가 로컬pc에 비하면 서버pc가 훨씬 크다는 것.
서버에 데이터를 저장하므로 서버에 부하가 걸릴 수 있다.

쿠키보다 세션을 쓰는 것이 더 안정적이고, 안전하지만 세션에 저장할 공간이 부족할 경우 쿠키가 사용된다.

session은 저장공간이고 request 객체를 통해 session을 가져오고, session에다 add나 set을 하고, 그렇게 저장된 세션은 페이지를 몇번이나 이동하더라도 계속해서 저장하고 있기 때문에, 로그인을 하고 나서 로그인 된 사용자가 다음 페이지로 이동 했을 때에 해당 사용자의 정보들을 잘 담아서 넘길 수가 있게 된다는 것.

login.jsp
폼 태그 안에서 아이디와 비밀번호

onclick 쓰는 이유는?
위에 있는 아이디 비밀번호 입력하지 않고 DB 연산을 할 필요가 없다는 것.
여기서 js로 막아주고 정상적으로 입력했을 때에는 DB연산을 한다.

또 한번 js를 사용하여 유효성 검사.
loginform을 객체로 가져와 사용.

submit을 누르면 action:"login_ok.jsp" 로 이동한다.

메서드를 get으로 하면 url에 입력한 패스워드가 보이니 post로 1차적으로 막아주자.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<input type="hidden" name="type" id="type" value="<%=request.getParameter("type")%>">
	<form action="login_ok.jsp" name="loginForm" method="post">
		<p>
			<label>
				아이디 : <input type="text" name="id">
			</label>
		</p>
		<p>
			<label>
				비밀번호 : <input type="password" name="password">
			</label>
		</p>
		<p>
			<input type="button" value="로그인" onclick="login()">
		</p>
	</form>
</body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"></script>
<script>
	if(document.getElementById("type").value == "false"){
		alert("로그인 실패");
	}

	function login(){
		var form = document.loginForm;
		if(!form.id.value){
			alert("아이디를 입력해주세요.");
			return
		}
		if(!form.password.value){
			alert("비밀번호를 입력해주세요.");
			return
		}
		
		form.password.value = btoa(form.password.value);
		
		form.submit();
	}
</script>
</html>

login_ok.jsp

사용자에게 보여질 페이지가 아닌 연산을 하는 곳.
사용자에게 전달받은 Parameter를 request라는 내장객체를 사용해서 전달받으면 되고,
String id, pw에 담는다.

이 두개를 DB에 검색하기 위해서는 UserDAO에서 login 메서드도 추가해준다.

사실 우리가 자바쪽에서 서블릿을 직접 사용한다면 이쪽에서 세션을 가져와 처리해주어야 하지만 jsp에서 쓰고있는 m1 방식을 쓰고 있기 때문에 login_ok.jsp에서 세션을 가져와야 한다. 얘가 서블릿이기 때문.
(.jsp는 컴파일 되면 .서블릿으로 바뀜)

HttpSession session = request.getSession();

해보면 이미 session이라는게 있다고 뜬다. 내장객체.

<%@page import="java.util.Base64"%>
<%@page import="java.util.Base64.Decoder"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<jsp:useBean class="dao.UserDAO" id="dao"/>
<%
	String id = request.getParameter("id");
	String pw = request.getParameter("password");
	
	Decoder decoder = Base64.getDecoder();
	pw = new String(decoder.decode(pw));
	
	//HttpSession session = request.getSession();
	if(dao.login(id, pw)){
		session.setAttribute("id", id);
		response.sendRedirect("login_success.jsp");
	}else{
		response.sendRedirect("login.jsp?type=false");
	}
%>

UserDAO.java

1개가 있다? 로그인 성공. 0개? 로그인 실패

	public boolean login(String id, String pw) {
		String query = "SELECT COUNT(ID) FROM TBL_USER WHERE ID = ? AND PASSWORD = ?";
		boolean check = false;
		conn = DBConnecter.getconnection();
		try {
			pstm = conn.prepareStatement(query);
			pstm.setString(1, id);
			pstm.setString(2, pw);
			
			rs = pstm.executeQuery();
			rs.next();
			check = rs.getInt(1) == 1;
			
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if(rs != null) {
					rs.close();
				}
				if(pstm != null) {
					pstm.close();
				}
				if(conn != null) {
					conn.close();
				}
			} catch (SQLException e) {
				throw new RuntimeException(e);
			}
		}
		return check;
	}
}
profile
코드를 두드리면 문이 열린다

0개의 댓글