๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Backend/Servlet & JSP

[Servlet]์ฟ ํ‚ค์™€ ์„ธ์…˜(2) - ์„ธ์…˜(Session)

by sukii 2024. 1. 20.
๋ฐ˜์‘ํ˜•

๐Ÿค”์„ธ์…˜(Session) : ์„œ๋ฒ„(์›นํ”„๋กœ๊ทธ๋žจ)์™€ ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €)์˜ ์—ฐ๊ฒฐ ์ง€์†์„ฑ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ์ •๋ณด๋ฅผ ์„œ๋ฒ„์— ์ €์žฅํ•˜๋Š” ๊ฐ์ฒด - WAS ํ”„๋กœ๊ทธ๋žจ์— ์˜ํ•ด ๊ด€๋ฆฌ(WAS ์„œ๋ฒ„์—์„œ ๊ด€๋ฆฌํ•œ๋‹ค๋Š” ๊ฒƒ์ด ์ฟ ํ‚ค์™€ ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ )
=> ๋ณด์•ˆ ๊ด€๋ จ ์ •๋ณด(๊ถŒํ•œ)๋ฅผ ์„ธ์…˜์— ์ €์žฅํ•˜์—ฌ ์‚ฌ์šฉํ•  ๋ชฉ์ ์œผ๋กœ ์ด์šฉ
=> ์„ธ์…˜์„ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•œ ์‹๋ณ„์ž(SessionId)๋ฅผ ์ด์šฉํ•ด ํด๋ผ์ด์–ธํŠธ์˜ ์„ธ์…˜์„ ๊ตฌ๋ถ„ํ•˜์—ฌ ์›นํ”„๋กœ๊ทธ๋žจ์—๊ฒŒ ์ œ๊ณต


โšซ์„ธ์…˜ ๋ฐ”์ธ๋”ฉ(Session Binding) : ์—ฐ๊ฒฐ ์ง€์†์„ฑ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ์ฒด๊ฐ€ ์ €์žฅ๋œ ์„ธ์…˜์„ ์›นํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฒฐํ•ฉํ•˜๋Š” ์ž‘์—… - WAS ํ”„๋กœ๊ทธ๋žจ


๐Ÿ”˜ ์›นํ”„๋กœ๊ทธ๋žจ์„ ์ตœ์ดˆ๋กœ ์š”์ฒญํ•œ ๊ฒฝ์šฐ
=> ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ [JSESSIONID]๋ผ๋Š” ์ด๋ฆ„์˜ ์ฟ ํ‚ค๊ฐ’์„ ์ œ๊ณต๋ฐ›์ง€ ๋ชปํ•œ ๊ฒฝ์šฐ ์„œ๋ฒ„์— ์ƒˆ๋กœ์šด ์„ธ์…˜์„ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ”์ธ๋”ฉ ์ฒ˜๋ฆฌํ•˜๊ณ , ์ƒ์„ฑ๋œ ์„ธ์…˜์˜ ์‹๋ณ„์ž(SessionId)๋ฅผ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ [JSESSIONID]๋ผ๋Š” ์ด๋ฆ„์˜ ์ฟ ํ‚ค๊ฐ’์œผ๋กœ ์ „๋‹ฌํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์— ์ €์žฅ 
=> [JSESSIONID]๋ผ๋Š” ์ด๋ฆ„์˜ ์ฟ ํ‚ค๋Š” ํด๋ผ์ด์–ธํŠธ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์†Œ๋ฉธ


๐Ÿ”˜ ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ [JSESSIONID]๋ผ๋Š” ์ด๋ฆ„์˜ ์ฟ ํ‚ค๊ฐ’์„ ์ œ๊ณต๋ฐ›์€ ๊ฒฝ์šฐ

=> ์„ธ์…˜ ํŠธ๋ž™ํ‚นํ•˜์—ฌ ๋ฐ”์ธ๋”ฉ ์ฒ˜๋ฆฌ
=> ์„ธ์…˜ ํŠธ๋ž™ํ‚น์ด ์‹คํŒจ๋œ ๊ฒฝ์šฐ ์ƒˆ๋กœ์šด ์„ธ์…˜์„ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ”์ธ๋”ฉ ์ฒ˜๋ฆฌ

*์„ธ์…˜ ํŠธ๋ž™ํ‚น(Session Tracking) : ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ [JSESSIONID]๋ผ๋Š” ์ด๋ฆ„์˜ ์ฟ ํ‚ค๊ฐ’๊ณผ ์„œ๋ฒ„์˜ ์„ธ์…˜ ์‹๋ณ„์ž(SessionId)๋ฅผ ๋น„๊ตํ•˜์—ฌ ๊ฒ€์ƒ‰ํ•˜๋Š” ์ž‘์—… 

 

 

์‹ค์Šต ์˜ˆ์ œ๐Ÿ‘ฉ‍๐Ÿ’ป

 

package xyz.itwill.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

//์„ธ์…˜์„ ๋ฐ”์ธ๋”ฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฐ”์ธ๋”ฉ๋œ ์„ธ์…˜์ •๋ณด๋ฅผ HTML ๋ฌธ์„œ๋กœ ์‘๋‹ตํ•˜๋Š” ์„œ๋ธ”๋ฆฟ
@WebServlet("/session.itwill")
public class SessionServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out=response.getWriter();
		
		//HttpServletRequest.getSession() : ๋ฐ”์ธ๋”ฉ ์ฒ˜๋ฆฌ๋˜์–ด ์ œ๊ณต๋œ ์„ธ์…˜์„ HttpSession ๊ฐ์ฒด๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์†Œ๋“œ 
		// => ์ƒˆ๋กœ์šด ์„ธ์…˜์„ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ”์ธ๋”ฉํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด ์„ธ์…˜์„ ํŠธ๋ž™ํ‚นํ•˜์—ฌ ๋ฐ”์ธ๋”ฉ ์ฒ˜๋ฆฌ
		//HttpSession ๊ฐ์ฒด : ์—ฐ๊ฒฐ ์ง€์†์„ฑ์„ ์ œ๊ณตํ•˜๋Š” ๊ฐ์ฒด(๊ฐ’)๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ์ฒด - ์„ธ์…˜
		//๋ธŒ๋ผ์šฐ์ €๋งˆ๋‹ค ์„ธ์…˜์€ ๋‹ค ๋‹ค๋ฆ„
		HttpSession session=request.getSession();
		
		out.println("<!DOCTYPE html>");
		out.println("<html>");
		out.println("<head>");
		out.println("<meta charset='utf-8'>");
		out.println("<title>Servlet</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("<h1>์„ธ์…˜(Session)/h1>");
		out.println("<hr>");
		//HttpSession.isNew() : HttpSession ๊ฐ์ฒด๋ฅผ ํŠธ๋ž™ํ‚นํ•˜์—ฌ ๋ฐ”์ธ๋”ฉํ•œ ๊ฒฝ์šฐ [false]๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ 
		//HttpSession ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ”์ธ๋”ฉํ•œ ๊ฒฝ์šฐ [true] ๋ฐ˜ํ™˜
		if(session.isNew()) {
			out.println("<p>์„ธ์…˜์„ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ”์ธ๋”ฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.</p>");
		} else {
			out.println("<p>์„ธ์…˜์„ ํŠธ๋ž™ํ‚นํ•˜์—ฌ ๋ฐ”์ธ๋”ฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.</p>");
			
		}
		//HttpSession.getId() : HttpSession ๊ฐ์ฒด๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•œ ์‹๋ณ„์ž(SessionId)๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์†Œ๋“œ
		out.println("<p>์„ธ์…˜ ์‹๋ณ„์ž(SessionId) ="+session.getId()+"</p>");
		
		//HttpSession.getMaxInactiveInterval() : HttpSession ๊ฐ์ฒด๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์‹œ๊ฐ„(์ดˆ)์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์†Œ๋“œ
		// => ์„ธ์…˜ ์œ ์ง€์‹œ๊ฐ„: ์„ธ์…˜์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ์„ธ์…˜์ด ์ž๋™ ์†Œ๋ฉธ๋˜๋„๋ก ์„ค์ •๋œ ์‹œ๊ฐ„
		// => ์„ธ์…˜์˜ ์œ ์ง€์‹œ๊ฐ„์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ 30๋ถ„ ๋™์•ˆ ์œ ์ง€๋˜๋„๋ก ์„ค์ •
		out.println("<p>์„ธ์…˜ ์œ ์ง€์‹œ๊ฐ„ ="+session.getMaxInactiveInterval()+"</p>");
		
		//HttpSession.getCreationTime() : HttpSession ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ ์‹œ๊ฐ„(TimeStamp)์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์†Œ๋“œ
		out.println("<p>์„ธ์…˜ ์ƒ์„ฑ์‹œ๊ฐ„ ="+session.getCreationTime()+"</p>");
		
		//HttpSession.setAttribute(String attributeName, Object attributeValue)
		// => HttpSession ๊ฐ์ฒด(์„ธ์…˜)์— ์—ฐ๊ฒฐ ์ง€์†์„ฑ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ’(๊ฐ์ฒด)์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ
		// => ๋งค๊ฐœ๋ณ€์ˆ˜์—๋Š” ๊ฐ’(๊ฐ์ฒด)๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•œ ์†์„ฑ๋ช…๊ณผ ์—ฐ๊ฒฐ ์ง€์†์„ฑ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ์†์„ฑ๊ฐ’ ์ „๋‹ฌ
		// => ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ์†์„ฑ๋ช…๊ณผ ๊ฐ™์€ ์ด๋ฆ„์˜ ์†์„ฑ๊ฐ’์ด ์„ธ์…˜์— ์ด๋ฏธ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋ฎ์–ด ์”Œ์šฐ๊ธฐ - ์†์„ฑ๊ฐ’ ๋ณ€๊ฒฝ
		// => ๋™์ผ ํด๋ผ์ด์–ธํŠธ๋Š” ์„ธ์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ์›นํ”„๋กœ๊ทธ๋žจ์—๊ฒŒ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜์—ฌ ์ œ๊ณต - ๊ฐ์ฒด ๊ณต์œ 
		session.setAttribute("now", new Date());
		
		//HttpSession.getAttribute(String attributeName) : ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ์ด๋ฆ„์œผ๋กœ
		//HttpSession ๊ฐ์ฒด(์„ธ์…˜)์— ์ €์žฅ๋œ ๊ฐ’(๊ฐ์ฒด)์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ
		// => HttpSession ๊ฐ์ฒด์— ์ €์žฅ๋œ ๋ชจ๋“  ์†์„ฑ๊ฐ’์€ Object ๊ฐ์ฒด๋กœ ๋ฐ˜ํ™˜๋˜๋ฏ€๋กœ ๋ฐ˜๋“œ์‹œ ๋ช…์‹œ์  ๊ฐ์ฒด ํ˜•๋ณ€ํ™˜ ์‚ฌ์šฉ
		// => ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ์†์„ฑ๋ช…์˜ ์†์„ฑ๊ฐ’์ด ์—†๋Š” ๊ฒฝ์šฐ [null] ๋ฐ˜ํ™˜
		Date now=(Date)session.getAttribute("now");
		out.println("<p>์„ธ์…˜์— ์ €์žฅ๋œ ์†์„ฑ๊ฐ’(๊ฐ์ฒด) ="+now+"</p>");
		
		//HttpSession.removeAttribute(String attributeName) : ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ์ด๋ฆ„์œผ๋กœ
		//HttpSession ๊ฐ์ฒด(์„ธ์…˜)์— ์ €์žฅ๋œ ๊ฐ’(๊ฐ์ฒด)์„ ์‚ญ์ œํ•˜๋Š” ๋ฉ”์†Œ๋“œ
		session.removeAttribute("now");
		
		//HttpSession.invalidate() : ๋ฐ”์ธ๋”ฉ๋œ ์„ธ์…˜์„ ์–ธ๋ฐ”์ธ๋”ฉ ์ฒ˜๋ฆฌํ•œ ํ›„ ์‚ญ์ œํ•˜๋Š” ๋ฉ”์†Œ๋“œ
		session.invalidate();
		
		//HttpSession ๊ฐ์ฒด๋ฅผ ์–ธ๋ฐ”์ธ๋”ฉ ์ฒ˜๋ฆฌํ•œ ํ›„ HttpSession ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด IllegalStateException ๋ฐœ์ƒ
		//session.setAttribute("now", new Date());
		
		out.println("</body>");
		out.println("</html>");
	}
}

 

 

์ฟ ํ‚ค์— ๋Œ€ํ•œ ์„ค๋ช… โฌ‡๏ธ

2024.01.19 - [Servlet & JSP] - [Servlet]์ฟ ํ‚ค์™€ ์„ธ์…˜(1) - ์ฟ ํ‚ค(Cookie)

 

[Servlet]์ฟ ํ‚ค์™€ ์„ธ์…˜(1) - ์ฟ ํ‚ค(Cookie)

๐Ÿค”์ฟ ํ‚ค(Cookie) : ์„œ๋ฒ„(์›นํ”„๋กœ๊ทธ๋žจ)์™€ ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €)์˜ ์—ฐ๊ฒฐ ์ง€์†์„ฑ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ์ •๋ณด๋ฅผํด๋ผ์ด์–ธํŠธ์— ์ €์žฅํ•˜๋Š” ๋ฌธ์ž๊ฐ’ ์ฟ ํ‚ค์™€ ์„ธ์…˜์˜ ๊ฐ ๊ฐœ๋…, ๋‘˜์˜ ์ฐจ์ด์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋†“์€ ๋ธ”๋กœ๊ทธ

sukis.tistory.com

 

๋ฐ˜์‘ํ˜•