📌세션(Session) 이란?
세션의 개념을 이해하기 위해선 HTTP 프로토콜의 특성부터 이해해야 한다.
HTTP 프로토콜의 대표적인 특징 중의 하나는 상태를 유지하지 않는 것이다.
즉, 클라이언트가 한 번 요청을 하고 서버에서 응답을 하면 해당 클라이언트와 서버와의 연결은 유지되지 않는다는 특징이 있다. 쉽게 설명하면 클라이언트가 첫 번째 요청을 보내고 서버가 이에 대한 답을 하고 똑같은 클라이언트가 두 번째 요청을 했을 때 서버에서는 두 번째 요청을 한 클라이언트가 첫 번째 요청을 한 클라이언트임을 인식하지 못한다.
💡HTTP 프로토콜의 요청 흐름
HTTP 프로토콜의 상태를 유지하지 않는 특징 때문에 로그인, 장바구니 담기 등 상태가 유지되어야 하는 프로그램은 작성하기가 힘들다.
이러한 단점을 보안할 수 있는 것이 바로 세션이다.
세션은 Servlet 에서 클라이언트와 서버의 상태를 유지하기 위해 제공되는 API이다.
💡세션(Session) 기능이 적용된 HTTP 프로토콜 요청 처리 순서
1. | C→S | 클라이언트의 첫 번째 요청 | |||||||
2. | C←S | 첫 번째 요청에 대한 응답 + 세션 아이디 | |||||||
3. | C | 쿠키에 세션 아이디 저장 | |||||||
4. | C→S | 두 번째 요청 + 쿠키에 저장된 세션 아이디 | |||||||
5. | S | 서버는 쿠키에 전송된 세션 아이디를 확인하고 두 번째 요청을 한 클라이언트가 첫 번째 요청을 한 클라이언트임을 인식한다. |
흐름
세션 기능을 이용하면 클라이언트의 요청에 대한 응답을 할 때 서버에서는 중복되지 않는 세션 아이디를 클라이언트마다 부여해서 응답에 같이 보낸다. 그리고 이 세션 아이디는 클라이언트의 쿠키 저장소에 저장되게 되고 클라이언트가 다시 요청하면 이 세션 아이디가 요청에 같이 전송 된다. 서버는 요청에 전송되어오는 세션 아이디를 판별하여 두 번째 요청을 한 클라이언트가 첫 번재 요청을 한 클라이언트임을 확인할 수 있다.
📌세션(Session) 사용법
Servlet에서는 세션을 다룰 수 있는 HttpSession 인터페이스를 제공하고 있다.
- HttpServletRequest.getSession(true)
이미 세션이 있다면 그 세션을 돌려주고, 세션이 없으면 새로운 세션을 생성한다. - HttpServletRequest.getSession(false)
이미 세션이 있다면 그 세션을 돌려주고, 세션이 없으면 null을 돌려준다(에러 발생). - HttpSession.setAttribute("Key",Value)
"Key"를 사용하여 객체를 세션에 바인딩한다.
Value는 값으로 들어올 자료형을 예측할 수 없기 때문에 Object형으로 upcasting하여 모두 받아낸다.
ex) HttpSession session = request.getSession();
session.setAttribute("name","여승철"); - HttpSession.getAttribute("Key")
"Key"로 바인딩된 객체를 돌려주고, "Key"로 바인딩된 객체가 없다면 null를 돌려준다.
Value는 세션을 저장할 대 Object형으로 upcasting했으므로, 가져올 댄 원래대로 downcasting해야한다.
ex) HttpSession session = request.getSession();
String name = (String)session.getAttribute("name");
예제
- 세션(Session) 기능을 사용한 로그인 프로그램
login.jsp
Servlet
SessionLoginServlet.java
39 : 아이디와 비밀번호가 java이면 인증되었다고 가정한다.
40~41 : 인증이 되었을 때 id라는 이름의 속성 값을 세션 영역에 생성한다.
42~43 : 요청 처리 페이지를 menu.jsp로 포워딩 한다.
46~49 : 로그인 실패했을 대 자바 스크립트로 경고 메시지를 출력해주고 인증하는 페이지로 돌아간다.
※ RequestDispatcher
Javax.servlet 패키지에 존재하는 RequestDispatcher 인터페이스는 특정 페이지로 포워딩하는 기능이 정의되어 있다. 모델 2로 작업을 할 때 자주 사용하는 인터페이스로 생성할 때 파라미터 값으로 포워딩될 URL이 온다.
그리고 43 줄에서 forward() 메서드가 호출될 때 실질적으로 해당 URL로 포워딩이 이루어진다.
JSP
menu.jsp
Servlet에서session 객체를 사용하기 위해서 위 서블릿 파일 예제와 같이 HttpSession session = request.getSession() 를 하여 세션 객체를 수동으로 생성해 주어야 한다.
하지만 JSP에서는 세션 객체를 자동으로 생성해주기 때문에 생성하는 코드 없이 위 menu.jsp 처럼 session객체를 바로 사용 가능하다.
결과
아이디 : qwer
비밀번호 : 1234
입력 후 [로그인] 클릭
아이디 : java
비밀번호 : java
입력 후 [로그인] 클릭
'JSP & Servlet > 개념' 카테고리의 다른 글
forward와 redirect 방식 (0) | 2022.03.28 |
---|---|
Server Tomcat v8.5 Server at localhost failed to start. Error (0) | 2022.03.25 |
[JSP & Servlet] 여러 개 파라미터 값(ex. 배열) 받기 - getParameterValues() (0) | 2022.03.25 |
[JSP] 한글 깨짐 (0) | 2022.03.25 |
[JSP] GET POST 차이 (0) | 2022.03.25 |