BackEnd/Servlet, JSP

[Servlet, JSP] Session과 login, logout 구현하기

샤아이인 2022. 1. 13.

Session 이란?

 

HTTP를 이용하여 클라이언트가 서버와 통실할때 서버측에 생성되는 "상태정보"를 세션이라 부릅니다.

세션은 HttpSession 인터페이스로 표현되며, HttpServletRequest의 getSession()을 통해 객체로 생성될 수 있습니다.

 

세션 객체가 생성될때 요청보내온 클라이언트의 정보, 요청시간, 등을 조합하여 세션ID 가 부여되며, 이 세션ID 는 클라이언트 측에서 쿠키로 저장됩니다.

 

세션 객체는 서버 측에 저장되며, 이후 사용자가 서버에 접근할때 세션ID를 이용하여 세션 객체에 접근합니다.

 

로그인/로그아웃 form 작성

우선 다음과 같이 간단한 html 문서를 작성하였습니다. form을 전달하기위한 용도로 필요한 내용만 작성하였습니다.

<!DOCTYPE html>
<html>
<head>
	<meta charset="EUC-KR">
	<title>회원 인증</title>
</head>
<body>
	<form action="locProc" method="post">
		ID : <input type="text" name="id"><br>
		비밀번호 : <input type="password" name="pwd"><br>
		<input type="submit" value="로그인">
	</form>
	
	<p>
	<a href="logProc">로그아웃</a>
</body>
</html>
 

위의 html을 보면 로그인과 로그아웃을 보면 둘다 action="logProc" 로 되어있는 것을 볼 수 있습니다.

그렇다면 동일한 URI에 대한 요청을 어떻게 구분하여 로그인과 로그아웃 처리를 분리하여 진행할까요?

 

바로! GET, POST 방식을 통해 구분합니다!

 

로그인을 할때 form을 전달할때는 POST 방식으로 진행하고, 로그아웃시 <a> 테그로 요청받았기에 GET방식으로 진행됩니다.

따라서 서버에서는 POST 방식의 요청이 들어오면 로그인 작업을 하고, GET방식의 요청이 들어오면 로그아웃을 하면 됩니다!

 

Servlet 구현

따로 DB를 연동하지는 않습니다. 그냥 Session에 따라 로그인/ 로그아웃 가능한지 판단하여 처리할 뿐 입니다.

package com.edu.test;

import java.io.*;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;

@WebServlet("/logProc")
public class LoginOutServlet extends HttpServlet {
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.setContentType("text/html;charset=UTF-8");
		PrintWriter out = resp.getWriter();
		String id = req.getParameter("id");
		String pwd = req.getParameter("pwd");
		
		
		if(id.isEmpty() || pwd.isEmpty()) {
			out.print("ID 또는 비밀번호를 정확히 입력해주세요.");
			return;
		}
		
		HttpSession session = req.getSession();
		
		if(session.isNew() || session.getAttribute("id") == null) {
			session.setAttribute("id", id);
			if(session.isNew()) {
				out.print("Session생성후, 로그인 완료");
			}else out.print("로그인을 완료하였습니다.");
		}else {
			out.print("현재 로그인 상태입니다.");
		}
	}
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.setContentType("text/html;charset=UTF-8");
		PrintWriter out = resp.getWriter();
		HttpSession session = req.getSession(false);
		if(session != null && session.getAttribute("id") != null) {
			session.invalidate();
			out.print("로그아웃 완료");
		}else {
			out.print("현재 로그인 상태가 아닙니다.");
		}
		out.close();
	}
}
 

댓글