JSP 세션에 대하여
세션(Session)의 개념
및
활용 예시
JSP Session은 웹 애플리케이션에서 사용자의 상태 정보를 유지하고 관리하기 위한 메커니즘이다. 사용자가 웹 애플리케이션에 접속하면 서버는 해당 사용자에 대한 고유한 세션을 생성하고, 이 세션을 통해 사용자의 상태를 추적하며, 각 세션은 고유한 세션 ID를 가지고 있으며, 이를 사용하여 클라이언트와 서버 간의 상태 정보를 식별한다.
JSP Session 특징
1. 세션 생성: 사용자가 웹 애플리케이션에 최초로 접속하면 서버는 새로운 세션을 생성한다. 세션은 일반적으로 사용자의 브라우저와 연결된 유효 시간을 가지며, 유효 시간이 지나면 세션은 만료된다.
2. 세션 식별: 각 세션은 고유한 세션 ID를 가지고 있다. 세션 ID는 일반적으로 쿠키 또는 URL 매개변수를 통해 클라이언트와 서버 간에 전달된다. 이를 통해 서버는 클라이언트가 요청을 보낼 때마다 해당 클라이언트의 세션을 식별할 수 있다.
3. 세션 데이터 저장: 세션은 사용자의 상태 정보를 저장하기 위한 컨테이너이며, 서버 측에서는 세션 객체를 사용하여 사용자의 세션 데이터를 저장하고 관리할 수 있다. 세션 데이터는 키-값 쌍으로 저장되며, 필요한 경우 세션 객체를 통해 데이터를 추가, 수정, 삭제하거나 조회할 수 있다.
4. 상태 유지: 세션을 사용하면 사용자의 상태를 유지할 수 있다. 예를 들어, 로그인 상태를 세션에 저장하여 사용자가 다른 페이지로 이동하더라도 로그인 상태를 유지 가능하다.
5. 보안: 세션은 서버 측에서 관리되므로 사용자가 직접 수정할 수 없기에, 세션 데이터는 서버에 저장되기 때문에 클라이언트에 노출되지 않으므로 보안상 안전하다.
JSP Session 메서드
1. session.setAttribute(String name, Object value): 세션에 데이터를 이름과 값의 쌍으로 저장
2. session.getAttribute(String name): 세션에서 특정 이름의 데이터를 조회
3. session.invalidate(): 세션을 만료시키고 세션에 저장된 모든 데이터를 제거
예를 들어, 로그인 정보, 사용자 설정, 장바구니 등을 세션에 저장하여 사용자 경험(UX)을 향상시킬 수 있다.
가장 무난한 로그인 페이지에서 Session을 활용하여 정보를 기억하고 유지시키는 예시이다.
로그인 및 회원가입 코드
https://2minmin2.tistory.com/57
Session 활용 페이지
- index.jsp: 메인 페이지로 로그인이 되었으면, 사용자의 정보를 기억하고 결과를 출력한다.
- login.jsp: 로그인 페이지이며 사용자의 ID, PW가 입력되면 그 값을 loginAction.jsp에 전송(POST)한다.
- loginAction.jsp: 전달받은(GET) 사용자의 ID, PW를 활용하여 값을 검사하고 Session을 통해 index.jsp에 결과를 전송하고 값을 기억한다.
- logout.jsp: 기억된 값을 지워버리는(Remove) 기능을 하는 페이지
코드 예시
1. index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Index</title>
</head>
<body>
<%
if(session.getAttribute("userID")==null){
out.println("<a href='login.jsp'>로그인</a>");
out.println("<a href='join.jsp'>회원가입</a>");
}else{
String userID=(String)session.getAttribute("userID");
out.println(userID+"님 환영합니다.");
out.println("<a href='logout.jsp'>로그아웃</a>");
}
%>
</body>
</html>
페이지를 실행시키면 <a 태그> 를 활용하여 로그인, 회원가입 페이지로 이동하는 링크가 나온다.
로그인을 누르면 login.jsp로, 회원가입을 누르면 join.jsp로 이동한다.
2. login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Login</title>
</head>
<body>
<h1>Login</h1>
<form method="post" action="loginAction.jsp">
<label for="userID">Username:</label>
<input type="text" id="userID" name="userID" required>
<br>
<label for="userPassword">Password:</label>
<input type="password" id="userPassword" name="userPassword" required>
<br>
<input type="submit" value="Login">
</form>
<button onclick="window.location.href='join.jsp'">Join</button>
</body>
</html>
index.jsp에서 로그인이 클릭되면 이동하는 페이지이다.
form 태그를 활용하여 userID와 userPassword의 값을 입력받은 값을 loginAction.jsp에 전송(POST)한다.
그 값을 loginAction.jsp에서 사용한다.
3. loginAction.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Login Action</title>
</head>
<body>
<%
String userID = request.getParameter("userID");
String password = request.getParameter("userPassword");
String dbURL = "jdbc:mysql://localhost:3306/mydb"; // 데이터베이스 URL 수정 필요
String dbUser = "root"; // 데이터베이스 사용자명 수정 필요
String dbPassword = "root"; // 데이터베이스 비밀번호 수정 필요
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(dbURL, dbUser, dbPassword);
String sql = "SELECT * FROM user WHERE userID=? AND userPassword=?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, userID);
pstmt.setString(2, password);
rs = pstmt.executeQuery();
if (rs.next()) {
out.println("Login Successful");
} else {
out.println("Invalid credentials. Please try again.");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
if(userID != null && userID.equals(password)){ // userID의 값을 확인하고
session.setAttribute("userID", userID); // 일치한다면, session에 저장
}
response.sendRedirect("index.jsp"); // 완료 후 index.jsp 페이지로 이동
%>
</body>
</html>
실제 입력받은 값을 활용하여 검사하고, 값이 일치한다면 session을 활용하여 저장한다.
마지막 3줄이 가장 중요함.
4. logout.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%
session.removeAttribute("userID");
response.sendRedirect("login.jsp");
%>
</body>
</html>
저장된 세션을 지우고 싶다면 로그아웃
실행 결과
1. index.jsp
2. login.jsp
사용자의 ID, PW 입력 후 Login 클릭
3. loginAction.jsp
ID, PW를 전달받아 검사 및 Session 저장/전송 후 Index.jsp로 이동
로그아웃이 클릭된다면 세션을 remove하고 다시 index.jsp 페이지 화면가 출력된다.
'Web > JSP' 카테고리의 다른 글
[Java] StringBuilder와 String의 차이 | 민민의 하드디스크 - 티스토리 (0) | 2023.08.07 |
---|---|
[JSP] 로그인, 회원가입 페이지 구현 | 민민의 하드디스크 - 티스토리 (5) | 2023.06.09 |
[JSP] 이클립스에서 JSP와 MySQL 연동하기 | 민민의 하드디스크 - 티스토리 (0) | 2023.06.09 |
[JSP] 이클립스(eclipse) 파일 저장 시 오류 | 민민의 하드디스크 - 티스토리 (2) | 2023.06.07 |