• 환경에 있는 서버의 종류에 대해 알아본 톰캣이 어떠한 역할 하고 세션정보를 어떻게 설정하는지 살펴보자.

  • 웹서버 vs WAS  vs 서블릿 컨테이너(톰캣)
    • 서버는 정적인 페이지(HTML,CSS) 제공하는 서버다.

    • WAS 서버 사이드 코드를 이용하여 동적인 컨텐츠를 만드는 서버다.
      서블릿 컨테이너는 오직 서블릿 API 지원하는 서버다.

    • 톰캣은 서블릿 컨테이너다. 서블릿과 JSP 위한 런타임 환경을 제공한다.
      • 톰캣은 애플리케이션 서버의 EJB(Enterprise Java Bean)같은 기술이 적용되지 않는다.
      • EJB J2EE 핵심인 트랜잭션 엔터프라이즈 환경에서 사용하는 컴포넌트 기술이다. 개발자가 비즈니스 로직에 집중할 수있게 미리 컴포넌트를 구현해놓은 환경을 말한다.
    • 자세한 비교
      • WAS
        • Java EE (EJB, JMS, CDI, JTA, 서블릿 API) 전체를 지원한다.
      • 톰캣이나 제티 같은 서버를 서블릿 컨테이너라고 부르는것은 사실 조금 애매하다.
        • 톰캣은 서블릿 뿐만 아니라 JSP 실행할 있기 떄문이다.

  • 톰캣이 세션 저장 방식에 대해 알아보자
  1. 로컬에 톰켓 설치 후 구동

  2. HTTP request, response 헤더를 확인해야 하기 때문에 크롬의 개발자 도구를 이용한다.

  3. 크롬 개발자 도구의 Network 탭을 선택한 후 http://localhost:8080/login.jsp 접속

  4. HTTP 헤더 정보를 보면 Response Headers에 쿠키 정보를 client로 전달한 것을 볼 수 있다. JSESSIONID 값이 톰켓에서 발급하는 쿠키 정보이다.

  1. 이와 같이 톰켓은 사용자가 로그인을 하지 않아도 최초 접속 시 JSESSIONID 쿠키 값을 브라우저에 내려주는 것을 알 수 있다. 그럼 왜 쿠키 값을 내려주는 걸까? HTTP 프로토콜은 stateless의 특징을 가지고 있기 때문에 사용자와 서버는 단 한번의 요청과 응답으로 연결이 끊어진다. 그렇기 때문에 서버에서는 사용자의 로그인 인증 여부를 확인할 수 있도록 key 값 처럼 사용할 수 있는 JSESSIONID 값을 클라이언트로 내려줌으로써 이를 이용하여 로그인 처리를 할 수 있는 것이다.

  2. http://localhost:8080/login.jsp 재요청
    재요청을 보내게 되면 client 브라우저는 로컬에 저장되어 있는 JSESSIONID 쿠키 값을 request header에 담아 서버로 전송한다. 톰켓은 client로부터 JSESSIONID 쿠키 값을 전달 받으면 response로 JSESSIONID 쿠키 값을 내려주지 않는다.

  1. 로그인 페이지에서 로그인 진행
    사용자가 아이디와 패스워드를 로그인 창에서 입력 후 서버로 전송을 하게 되면 웹 애플리케이션에서 사용자 인증 후 세션 객체에 JSESSIONID 쿠키 값을 키로 사용하는 사용자 정보를 메모리 영역에 저장하게 된다.
    이와 같이 키 값으로 사용되는 세션 아이디 값이 메모리에 저장 됨으로써 사용자는 로그인 상태를 유지하면서 여러 페이지를 이동하여도 로그인 상태를 유지할 수 있는 것이다.
  • 개발 장비에 포트만 달리하는 3개의 어플리케이션이 적재되어 있다. (톰켓 instance 3개)
    • 222.111.111.111:8001
    • 222.111.111.111:8002
    • 222.111.111.111:8003

  •  하나의 애플리케이션에서 로그인 후 또 다른 어플리케이션에 로그인 하면 처음에 로그인 했던 어플리케이션의 세션이 사라져서 자동으로 로그아웃 처리 된 것을 확인할 수 있는데 이는 JSESSIONID 라는 쿠키 이름의 충돌 때문이다.

  • 충돌이 발생하는 이유는 각 애플리케이션의 아이피가 같기 때문이다.

  • 참고로 쿠키는 포트를 구분하지 않기 때문에 8001, 8002, 8003 포트로 서비스를 분리하여도 동일 서비스로 인식하여 로컬에 저장되어 있는 쿠키를 서버로 전송한다.

  • 이를 해결하기 위해서는 server.xml의 context에 다음을 추가하여 각 서비스를 구분하면 위의 문제를 해결할 수 있다. sessionCookieName="ADMIN_JSESSIONID"

  • 추가적으로 톰켓은 JSESSIONID 쿠키를 풀 도메인으로 셋팅한다. 즉, 서브 도메인이 서로 다르면 JSESSIONID 값도 달라진다는 것이다.

+ Recent posts