반응형

Session

 쿠키는 웹클라이언트(웹 브라우저)에 저장하는 것에 반해 세션은 반대로 웹 서버에 저장하는 정보이다.
세션은 오직 웹 서버에만 생성이 되며 웹 브라우저 하나 당 하나의 세션을 생성한다.

즉 같은 JSP페이지라고 하더라도 웹 브라우저마다 서로 다른 세션을 사용하게 된다.

그래서 세션은 웹 브라우저와 관련된 1대 1의 정보를 저장하기 알맞은 장소이다.
쿠키와 마찬가지로 세션 역시 생성해야 사용이 가능하며 session 기본객체를 통해 사용할 수 있다.

 

세션 생성하기
      세션은 JSP페이지에서 디폴트로 생성된다.

기본 값으로 다음과 같이 설정되어 있다. <%@ page session=”true” %>
웹 브라우저가 최초로 웹 서버에 접근 했을 때 생성되고 세션이 종료될 때까지 세션을 사용한다.

 

session기본 객체
    세션을 사용한다는 것은 기본 객체 중 session객체를 사용한다는 것이다.
    setAttribute(), getAttribute() 등의 메서드를 사용하여 속성 값을 저장하거나 가져올 수 있다.
    세션은 세션만의 고유정보가 있는데 아래와 같은 메서드를 사용한다.


 세션은 브라우저마다 생성되므로 이를 구분할 기준이 필요한데 이 때 세션 ID를 사용한다.
 웹 브라우저가 웹 컨테이너에 접근 할 때마다 웹 브라우저에게 쿠키를 통해서 세션 ID를 보내준다.

그리고 웹 브라우저는 전송 받은 세션ID를 사용할지 판단한다.
 그리고 session기본 객체를 사용할 때마다 최근에 사용한 시간을 기록한다.

 이 시간을 확인하여 세션 타임아웃을 관리하게 된다.

 

예제코드
/JSP_TEST/session/sessionInfo.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page session="true"%>
<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%
    Date time = new Date();
    SimpleDateFormat formatter = 
            new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
%>
<html>
<head>
<title>세션 정보</title>
</head>
<body>
세션 ID : <%= session.getId() %> <br>
<%
    time.setTime(session.getCreationTime());
%>
최초 세션 생성 시간 : <%= formatter.format(time) %> <br>
<%
    time.setTime(session.getLastAccessedTime()); 
%>
마지막에 접근 시간 : <%= formatter.format(time) %>
</body>
</html>
 
cs

 

요청결과


session 기본객체의 속성 사용
    한번 생성된 세션은 유효시간 동안 유지된다.
    웹 어플리케이션을 실행하는 동안 유지될 필요가 있는 값을 저장하기 유용하다.
    request객체는 요청에서만 유지되는 것에 반에 session객체는

    여러 요청이 처리되는 동안 JSP페이지 사이에서 계속 유지된다.
    로그인 정보 유지와 같은 웹 브라우저와 1대 1로 mapping 되는 값을 저장하기에 효율 적이다.
    즉, 쿠키대신 세션을 사용할 수 있다.

 

다음 예제를 통해 세션에 값을 저장하고 불러오는 동작을 확인한다.
/WebContent/JSP_TEST/session/setMemberInfo.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
    session.setAttribute("MEMBER""purple");
    session.setAttribute("NAME""홍길동");
%>
<html>
<head>
<title>세션에 정보 저장</title>
</head>
<body>
 
세션에 정보를 저장하였습니다.
 
</body>
</html>
cs

 

요청결과

 

세션에 저장된 값을 확인하기 위한 예제코드 작성

/WebContent/JSP_TEST/session/getMemberInfo.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
    String member = (String)session.getAttribute("MEMBER");
    String name = (String)session.getAttribute("NAME");
%>
<html>
<head>
<title>세션 값 사용하기</title>
</head>
<body>
 
소속 : <%= member %><br>
이름 : <%= name %>
 
</body>
</html>
 
cs

 

요청결과 - 세션에 값을 저장하는 setMemberInfo.jsp를 먼저 요청 후 실행

하나의 브라우저에서 요청해야 함.

만일 브라우저가 달라지면 세션이 다르므로 저장된 값을 불러오지 못함

위와 같이 세션에 값을 저장하고 그 값을 사용할 수 있다.
한번의 요청이 아니라 여러 JSP페이지를 요청하는 동안 유지될 값은 세션에 저장하여 사용할 수 있다.

 

쿠키 대신 세션을 사용하는 이유
    세션이 쿠키보다 보안성이 높다.
    쿠키의 이름이나 데이터는 네트워크를 통해 전달되므로 일반적인 HTTP프로토콜을 가로채서

   쿠키 내용을 읽을 수 있다.
    하지만 세션의 값은 서버에 저장되는 값이므로 누군가 가로챌 위험이 적다.
    흔하진 않지만 간혹 웹 브라우저에서 쿠키를 지원하지 않을 경우나 쿠키 사용을 강제로 막은

   경우 쿠키를 사용할 수 없다.
    하지만 세션은 쿠키설정과 무관하게 사용할 수 있는 특징이 있다.

세션 종료
    세션을 유지할 필요가 없는 경우 session.invalidate() 메서드를 사용하여 세션을 종료하면 된다.

    그러면 사용 중이던 세션 객체가 삭제되므로 모든 속성과 값이 삭제된다.

    다음 예제를 작성하고 sessionInfo.jsp -> closeSession.jsp -> sessionInfo.jsp 순으로 실행해서 확인해보자.

 

예제 코드

/WebContent/JSP_TEST/session/closeSession.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
    session.invalidate();
%>
<html>
<head>
<title>세션 종료</title>
</head>
<body>
세션을 종료하였습니다.
</body>
</html>
cs

 

sessionInfo.jsp – 세션 생성


closeSession.jsp – 세션 종료

 
sessionInfo.jsp – 세션 생성

 
세션이 생성 된 후 세션을 종료하면 기존 세션 객체가 삭제된다.

이 후 다시 세션을 생성하면 전의 세션 ID와 값이 다르게 새로 생성된다.

 

세션의 유효시간
    JSP 페이지에서 세션을 사용하도록 설정되어 있는 경우(디폴트 값으로 사용하도록 설정되어

   있음 <%@ page session=”true”%>)세션은 마지막 접근 시간을 저장하며 session 기본객체가

   사용될 때마다 세션의 마지막 접근 시간이 갱신된다.
    이러한 시간을 사용하여 세션의 유효시간 동안 접근이 없을 경우 자동으로 세션을

   종료하도록 한다. 이후 새로운 접근을 하면 새롭게 세션이 생성된다.

세션 유효시간 설정 방법
    1. /WEB-INF/web.xml 파일에 <session-config> 태그를 사용하여 유효시간을 지정하는 방법

       (분 단위 설정)
         

 

2. session.setMaxInactiveInterval() 메서드를 사용하는 방법

         (초 단위 설정)

   

 

세션의 유효시간을 설정할 때 0 또는 음수로 설정하면 유효시간이 없어 메모리에 계속 남아있다. 이렇게 세션을 관리할 경우 세션이 자동으로 종료되지 않으므로 session.invalidate() 메서드를 사용하여 종료해 주어야 한다.

 

세션 유효 시간의 필요성
 웹 사이트에 로그인한 다음 웹 브라우저를 닫지 않고 자리를 비운 경우 유효시간이 없다면

다른 사람이 무심코 원래 사용자의 중요 정보를 보게 될 수도 있다.

그래서 세션에 시간을 지정하여 해당 시간 동안 요청이 없을 경우

세션을 종료해 주는 것이 안전하기 때문이다.

 은행 사이트를 보면 공인인증서로 로그인한 후 부터 접속이 끊길때까지의

시간이 흐르는 것을 볼 수 있다.

 이런 개념이 세션의 유효시간을 설정하는 이유이다.

request.getSession()을 사용하여 세션을 생성하는 방법
 request기본객체의 getSession() 메서드를 사용하면 세션 객체가 있을 경우 해당 세션 객체를 반환하고 없을 경우 새로 생성하여 반환한다.

 
 
 
 
<%
     HttpSession httpSession = request.getSession();
%>
 
cs

 

session객체가 있는 경우에만 session을 가져오고 싶은 경우 getSession(false) 형태로 실행하면 session객체가 있을 경우에만 객체를 반환한다. 세션 객체가 없을 경우 null을 반환한다.

세션을 이용한 인증정보 유지

세션을 사용하는 로그인 유지방법은 쿠키와 비슷하다.
1. 로그인에 성공하면 session기본 객체에 속성을 만들어 로그인을 유지할 때

 필요한 정보를 저장한다.

2. 이 후 session이 존재하면 로그인한 상태로 간주한다.
3. 로그아웃을 할 경우 session.invalidate() 메서드를 호출하여 세션을 종료한다.

 

로그인한 후 필요한 세션정보 저장
/WebContent/JSP_TEST/member/sessionLogin.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
    String id = request.getParameter("id");
    String password = request.getParameter("password");
    
    if(id.equals(password)){
        session.setAttribute("MEMBERID", id);
%>
<html>
<head>
<title>로그인 성공</title>
</head>
<body>
로그인 성공
</body>
</html>
<%
    } else { //로그인 실패
%>
<script>
alert("로그인에 실패하였습니다.");
history.go(-1);
</script>
<%
    }
%>
cs

 

다음 페이지를 작성하여 로그인을 해보자. (ID와 Password가 같으면 로그인 가능)
/WebContent/JSP_TEST/member/sessionLoginForm.jsp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<html>
<head>
<title>로그인</title>
</head>
<body>
    <form action="<%=request.getContextPath()%>/member/sessionLogin.jsp"
        method="POST">
        아이디 <input type="text" name="id" size="10"> 암호 <input
            type="password" name="password" size="10"> <input
            type="submit" value="로그인">
    </form>
</body>
</html>
 
cs

 

요청결과 - 아이디 비밀번호 입력 및 로그인

 

로그인 결과

 

세션을 사용한 인증 여부 확인
/WebContent/JSP_TEST/member/sessionLoginCheck.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
    String memberId = (String)session.getAttribute("MEMBERID");
    boolean login = memberId == null ? false : true;
%>
<html>
<head>
<title>로그인 여부 검사</title>
</head>
<body>
<%
    if(login){
%>
아이디 : [<%= memberId %>] 로 로그인 한 상태
<%
    } else {
%>
로그인 하지 않는 상태
<%
    }
%>
</body>
</html>
 
cs

 

요청결과 - 로그인 상태와 로그인하지 않은 상태로 각각 요청해보면 결과가 다르다.

 

로그아웃 시 세션 종료 처리
/WebContent/JSP_TEST/member/sessionLogout.jsp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
    session.invalidate();
%>
<html>
<head>
<title>로그아웃</title>
</head>
<body>
로그아웃 되었습니다.
</body>
</html>
 
cs

 

요청결과

 

다시 sessionLoginCheck.jsp를 실행하면 다음과 같이 세션이 삭제되어 로그인 하지 않는 상태가 된다.


이제 세션을 이용하는 예제를 더 보도록 한다.

세션으로 관리할 데이터들이 많아지고 그룹화 할 수 있을 만큼의 연관된 정보가 많아질 경우 클래스를 작성하여 편리하게 세션을 관리하도록 한다.

 

연관된 정보를 저장하기 위한 클래스 사용
  앞에 예제에서 사용한 ID값 이외에 더 필요한 값을 세션에 저장해야 할 경우 간단히 세션 속성을 더 추가해도 되지만 저장되는 값이 한 두 개가 아니라 많은 정보를 저장해야 한다면 코드는 세션 속성의 개수 추가한 만큼 길어지고 복잡해 질 것이다. 그리고 모든 속성을 하나하나 따로 관리해야 하므로 개발자 입장에서 유지보수에 많은 어려움이 생길 수 있다.

 이런 문제점을 줄일 수 있는 방법으로 세션에 저장할 속성을 묶어 클래스로 관리하는 것이다.

 

다음과 같이 클래스를 만들어서 관리한다고 생각해보자.

 
 
 
 
 
 
 
 
 
 
 
 
public class MemberInfo {
    private String id;
    private String name;
    private String email;
    private boolean male;
    private int age;
    //생성자 메서드
    //set 메서드
    //get 메서드
    //...
}
 
cs

위와 같이 클래스를 사용하면

 
 
 
 
<%
    MemberInfo memberInfo = new MemberInfo("id, name");
    session.setAttribute("memberInfo", memberInfo);
%>
cs
위와 같이 객체에 세션의 속성 값을 각각 저장하고 다음과 같이 속성 값을 가져와서 사용할 수 있다.
 
 
 
 
 
<%
    MemberInfo member = (MemberInfo)session.getAttribute("memberInfo");
%>
...
<%= member.getName() %>
cs
이렇게 클래스를 사용할 경우 세션의 속성에 값이 없을 경우 Exception이 아니라 컴파일 에러가 발생하게 되므로 유지보수를 비교적 수월하게 할 수 있게 된다.

 

 쿠키와 세션은 브라우저와 서버간에 유지할 데이터를 저장하는 역할로 차이점을 이해하고 유지할 값의 특성이나 동작에 따라 적절하게 사용할 수 있어야 된다.
 

 

반응형

+ Recent posts