본문 바로가기
스프링 부트/자바 웹을 다루는 기술

9.4 세션을 이용한 웹 페이지 연동 기능

by 989898 2024. 1. 22.

이번에는 세션을 이용해 웹 페이지들을 연동하는 방법을 알아보겠다.

 

세션 역시 웹 페이지들 사이의 공유 정보를 서버에 저장해 두고 웹 페이지들을 매개해 주는 방법이라는 점에서는 쿠키와 같다. 하지만 쿠키는 사용 시 웹 페이지들의 정보가 클라이언트 PC에 저장되므로 정보가 쉽게 노출될 수 있다는 단점이 있는 반면, 세션은 서버의 메모리에 생성되어 정보를 저장한다. 

 

따라서 웹 페이지에서 사용되는 정보 중에 로그인 정보처럼 보안이 요구되는 정보는 대부분 세션을 이용한다.

 

세션은 각 브라우저당 한 개, 즉 사용자당 한 개가 생성된다. 사용자의 로그인 상태나 쇼핑몰의 장바구니 담기 기능 같은 정보를 해당 브라우저의 세션에 저장해 두고 사용하면 편리하다.

 

세션의 특징은 다음과 같습니다.

 정보가 서버의 메모리에 저장됩니다.

 브라우저의 세션 연동은 세션 쿠키를 이용합니다.

 쿠키보다 보안에 유리합니다.

 서버에 부하를 줄 수 있습니다.

 브라우저(사용자)당 한 개의 세션(세션 id)이 생성됩니다.

 세션은 유효 시간을 가집니다(기본 유효 시간은 30분입니다).

 로그인 상태 유지 기능이나 쇼핑몰의 장바구니 담기 기능 등에 주로 사용됩니다.

9.4.1 세션 기능 실행 과정

 

클라이언트의 브라우저가 서버에 최초 접속하면 서버의 서블릿은 세션 객체를 생성한 후 세션 객체에 대한 세션 id를 브라우저에 전송한다. 그러면 브라우저는 이 세션 id를 브라우저가 사용하는 세션 쿠키에 저장한다. 즉, 서버로부터 전송된 세션 id도 쿠키이며, 쿠키 이름은 jsessionId이다.

 

세션id(쿠키)를 브라우저에 전송 - 이 세션 id(쿠키)를 브라우저의 세션 쿠키에 저장.

그리고 재접속하여 세션 쿠키에 저장된 세션 id(jsessionId)를 다시 서버로 전송하면 서버에서는 전송된 세션 id를 이용해 브라우저의 세션 객체에 접근하여 브라우저에 대한 작업을 수행한다.

 

 브라우저로 사이트에 접속합니다.

 서버는 접속한 브라우저에 대한 세션 객체를 생성합니다.

 서버는 생성된 세션 id를 클라이언트 브라우저에 응답합니다.

 브라우저는 서버로부터 받은 세션 id를 브라우저가 사용하는 메모리의 세션 쿠키에 저장 (쿠키 이름은 jsessionId).

 브라우저가 재접속하면 브라우저는 세션 쿠키에 저장된 세션 id를 서버에 전달합니다.

 서버는 전송된 세션 id를 이용해 해당 세션에 접근하여 작업을 수행합니다.

 

세션의 중요한 특징은 브라우저당 한 개씩 생성된다는 점이다. 그러므로 브라우저가 서버에 접속하여 브라우저에 저장된 세션 id(jsessionId)를 전송하면 서버는 그 값을 이용해서 해당 브라우저에 대한 세션을 구분하고 각 브라우저에 대한 세션 작업을 수행한다.

9.4.2 세션 API의 특징과 기능

 

서블릿에서 세션을 이용하려면 HttpSession 클래스 객체를 생성해서 사용해야 한다.

 

HttpSession 객체는 HttpServletRequest의 getSession() 메서드를 호출해서 생성한다.

 

세션을 얻는 getSession() 메서드로는 다음과 같은 것들이 있다.

 getSession(): 기존의 세션 객체가 존재하면 반환하고, 없으면 새로 생성합니다.

 getSession(true): 기존의 세션 객체가 존재하면 반환하고, 없으면 새로 생성합니다.

 getSession(false): 기존의 세션 객체가 존재하면 반환하고, 없으면 null을 반환합니다.

 

또한 HttpSession 클래스에서 제공하는 세션 기능 관련 메서드는 표 9-3에 정리했다.

9.4.3 서블릿에서 세션 API 이용하기

 

그럼 지금부터는 세션 API를 이용해 직접 세션을 생성해 보겠다.

 

1. 다음과 같이 세션 테스트를 위한 실습 파일인 SessionTest 클래스를 준비.

 

2. SessionTest 클래스를 다음과 같이 작성한다. request의 인자 없는 getSession() 메서드를 호출하여 세션이 없으면 새로 생성하고, 세션이 있으면 기존 세션을 가져온다. 또한 세션 객체의 getMaxInactiveInterval()를 호출하여 생성된 세션의 유효 시간을 가져온다.

 

 

3. 브라우저에서 최초 요청 시 생성된 세션 객체에 할당된 세션 id와 여러 가지 정보를 출력한다. 최초 생성된 세션이므로 “새 세션이 만들어졌습니다.”라는 메시지가 출력된다.

 

4. 같은 브라우저에서 다른 탭을 열고 요청하면 같은 세션 id를 출력하므로 최초 생성된 세션을 재사용한다. 따라서 “새 세션이 만들어졌습니다.”라는 메시지는 출력되지 않는다.

다음은 서블릿에서 생성된 세션 id, 즉 브라우저로 전송되어 세션 쿠키에 쿠키 이름 jsessionID로 저장된 세션 id이다.

 

현재 윈도 10의 운영체제에서는 같은 PC의 브라우저나 다른 탭에서 요청을 해도 기존 세션을 유지한다. 그러면 이번에는 같은 PC에서 기존 브라우저의 세션으로 연결되지 않고, 다른 브라우저로 다른 세션을 만드는 방법을 알아보겠다. 즉, 새 세션으로 브라우저를 여는 과정이다.

 

9.4.4 다른 브라우저에서 새 세션 만들기

 

브라우저에서 Ctrl + Shift + N을 눌러 시크릿 모드의 크롬을 실행합니다.

 

주소창에서 /sess로 요청하면 새로운 세션을 생성한 후 다른 세션 id를 출력합니다.

/sess로 요청 시 새로운 세션이 생성

 

세션 기본 유효 시간은 톰캣 컨테이너에서 지정한 30분(1800초)이다. 그러나 HttpSession setMaxInactiveInterval() 메서드를 이용하면 사용자가 원하는 세션 유효 시간을 설정할 수 있다. 그리고 invalidate() 메서드를 이용하면 세션을 언제든지 삭제할 수도 있다.

 

다음과 같이 톰캣 컨테이너의 web.xml에 세션 기본 유효 시간이 설정된 것을 확인할 수 있다.

 

이번에는 제공되는 메서드들을 이용해서 직접 세션 유효 시간을 재설정해 보겠다.

 

2. SessionTest2 클래스를 다음과 같이 작성한다. setMaxInactiveInterval() 메서드를 이용해 세션 유효 시간을 5초로 재설정한다.

 

3. 최초에 /sess2로 요청하여 설정 전 유효 시간과 설정 후 유효 시간을 출력한다.

최초 요청 시 결과

 

4.  5초가 지난 후 같은 브라우저에서 재요청하면 다시 새 세션이 생성됩니다.

5초 경과 후 요청 시 결과

 

최초 요청 시 세션의 id와 5초 경과 후 요청 시 세션의 id가 다르다. 즉, 5초 이후에는 기존 세션은 삭제되고 재요청 시 새 세션이 생성된다.

 

세션 유효 시간을 재설정하는 경우는 주로 은행 사이트에서 자주 발생한다. 우리가 보통 은행 사이트에 로그인하면 화면 위쪽에 10분에서 초 단위로 역카운팅이 되는 것이 보이다. 만약 10분 이상 아무 작업도 하지 않으면 로그인 상태를 기억하는 세션이 자동 삭제되어 자동 로그아웃 화면을 출력한다.

 

 

이번에는 사용자가 강제로 세션을 삭제하는 기능을 실습해 보겠다.

 

1. 다음과 같이 실습 파일을 준비한다.

 

2. SessionTest3 클래스를 다음과 같이 작성합니다. invalidate() 메서드를 이용해 강제로 세션을 삭제한다.

 

3. 최초 요청 시 새 세션이 생성된 후 invalidate() 메서드가 호출되므로 바로 소멸된다.

 

4. 재요청 시 다른 세션이 생성된다.

9.4.5 세션을 이용한 로그인 정보 바인딩 실습

 

지금까지는 HttpServletContext HttpServletRequest의 바인딩 기능을 사용했다. 그런데 로그인 상태처럼 사용자와 관련된 정보를 바인딩해서 사용할 때는 세션을 이용하는 것이 편리하다. 세션은 사용자당 한 개씩 생성되기 때문이죠. 이번 절에서는 로그인을 이용해 HttpSession의 바인딩 기능을 알아보겠다.

 

1. 실습하기 전에 해야 할 일이 있다. 톰캣이 종료된 후에도 세션이 메모리에서 삭제되지 않는 경우가 있으므로 톰캣 설정 파일인 context.xml을 열어 <Manager pathname=”” /> 태그의 주석을 해제해야 한다.

context.xml의 Manager 태그 주석 해제

 

2. 다음과 같이 실습 파일을 준비한다.

 

3. 로그인창에서 ID와 비밀번호를 입력한 후 서블릿으로 전송할 수 있도록 login2.html 파일을 작성한다.

 

4. SessionTest4 클래스를 다음과 같이 작성한다. 로그인창에서 로그인한 경우 ID와 비밀번호를 가져오고, 최초 요청 시 세션에 setAttribute() 메서드를 이용해 user_id로 사용자 ID를 바인딩하도록 구현한다. <a> 태그를 이용해 재요청하고 세션의 getSttribute() 메서드를 이용하여 user_id 값을 가져와 로그인 여부를 확인한다.

 

5. 로그인창 요청 후 ID와 비밀번호를 입력하고 전송한다.

로그인창에서 로그인

 

6. 최초 로그인 시 세션에 ID를 바인딩한다.

7. 다시 로그인 상태 확인을 클릭해 /login으로 재요청하면 현재 로그인 상태를 출력한다.

8. 톰캣 재실행 후 로그인창을 거치지 않고 바로 /login으로 요청하면 세션에 ID가 없으므로 “다시 로그인 하세요!!”라는 메시지가 출력된다.

 

이상으로 세션 기능을 알아보았다. 세션은 브라우저 한 개당 생성되므로 로그인 상태 정보나 쇼핑몰 장바구니 정보 등 브라우저에서만 사용하는 정보를 바인딩해서 사용하면 편리하다는 것을 잊지 말자!