WAR이 세션 정보를 공유 할 수없는 이유는 무엇입니까?


11

: 나는 여러 개발자들이이 문제에 대한 해결책을 찾고 본 다른 WAR에서 세션 정보에 액세스 : - 여기에 몇 가지 샘플이 있습니다 (같은 EAR 내부에도) 바람둥이 서로 다른 응용 프로그램간에 공유 세션 상태에 대한 모든 방법은? , 다른 웹 응용 프로그램 , 다른 WAR 파일, 공유 리소스 의 액세스 세션 , Tomcat : 두 응용 프로그램간에 데이터를 공유하는 방법은 무엇입니까? , Tomcat에서 crossContext 속성은 무엇입니까? 세션 공유가 가능합니까? 등등...

내가 검색 한 모든 것에서 컨테이너에 따라 특정 솔루션이 있지만 어떻게 든 ' 사양과 반대됩니다 '. 또한 대답을 찾는 데 아무런 운이없이 Java EE 사양을 살펴 보았습니다.

일부 개발자는 웹 응용 프로그램 간의 연결에 대해 이야기하지만 동의하지 않는 경향이 있습니다. 커플 링이 아닌 경우 WAR을 동일한 EAR 내에 유지하는 이유는 무엇입니까? 예를 들어 EJB는 같은 EAR 내의 다른 EJB JAR 내부에 있더라도 로컬로 액세스 할 수 있습니다.

보다 구체적으로, 내 WAR 중 하나가 인증 및 권한 부여를 처리하며이 정보를 다른 WAR (동일한 EAR)과 공유하고 싶습니다. WAR를 JAR로 패키징하고 단일 WAR 프로젝트 (WEB-INF / lib)에 넣음으로써 비슷한 문제를 해결하기 전에 관리했습니다. 그러나 나는이 솔루션을 좋아하지 않습니다 (서블릿 이름 지정 등에 많은 노력이 필요합니다).

그리고 첫 번째 (가장 중요한) 질문에 대한 해결책은 없습니다. 왜 WAR은 세션 정보를 공유 할 수 없습니까?


1
이것이 왜 SO에 더 적합한 지 이외의 이유는 확실하지 않습니다.
NateDSaint

3
"서블릿 2.3 API 스펙에 따르면, 세션 관리자는 웹 모듈에 의한 세션 범위 만 지원합니다. 동일한 웹 모듈에있는 서블릿 만이 특정 세션과 연관된 데이터에 액세스 할 수 있습니다." 이것은 HttpSession 에서 다시 볼 수 있습니다. "세션 정보는 현재 웹 애플리케이션 (ServletContext)에만 적용되므로 한 컨텍스트에 저장된 정보는 다른 컨텍스트에서 직접 볼 수 없습니다." -사양에 위배됩니다.

(더 나은, 현재 링크 의 HttpSession )

@MichaelT 감사합니다. 그러나 여전히 이유에 대한 답은 아닙니다.
rvcoutinho

@NateDSaint 질문은 특정 기술과 관련이 있지만 개념적인 질문 일 가능성이 더 크다고 생각했습니다. 그런 다음 프로그래머를 결정했습니다.
rvcoutinho

답변:


7

EAR을 의사 가상 머신처럼 취급

EAR은 일반적으로 JAR에서 공통 구성 및 라이브러리를 공유하는 WAR 파일의 모음입니다. 이를 통해 응용 프로그램 컨테이너 내에서 상호 의존적 인 서비스 모음을보다 쉽게 ​​관리 할 수 ​​있습니다. 따라서 EAR을 컨테이너에 배치하면 EAR을 단순한 형태의 가상 머신으로 생각할 수 있습니다.

가상 머신의 한 프로세스가 다른 프로세스에 영향을 줄 수없는 것과 같은 방식으로 EAR에서도 마찬가지입니다. 모든 WAR은 내부 상태를 보호하기 위해 격리됩니다.

스케일링 인증

일반적으로 웹 응용 프로그램은 확장이 잘되도록 상태 비 저장 상태 여야합니다. 세션에 많은 정보를 갖는 것은이를 방지하는 반 패턴입니다. 이는 HTTP의 상태 비 저장 특성과 신속하고 사용자 정의 된 사용자 경험을 유지해야 할 필요성간에 충돌을 일으 킵니다. 인증은 전형적인 사용 사례이며 최종 사용자 기능을 제공하기 위해 많은 인증 된 요청이 필요한 수다스러운 API에서 널리 사용됩니다.

특히 수평 스케일링이있는 경우 싱글 사인온 및 싱글 사인 오프가 올바르게 작동하려면 신중하게 신호를 보내야합니다 (부분 사인 오프 고려). 단순히 세션 상태를 공유하는 것은 결코 좋은 솔루션이 아니며 더 나은 방법은 클러스터의 모든 노드가 액세스 할 수있는 사용자 정보에 대해 단일 참조 지점을 사용하는 것입니다.

관련 정보에 대한 빠른 캐시 액세스에 집중하면 일부 복잡하고 취약한 세션 공유 솔루션보다 훨씬 확장 가능한 결과를 얻을 수 있습니다.


감사합니다, @GaryRowe. 이것이 내가 찾던 대답입니다. 어쨌든 개발자가 결정할 수 없었습니까?
rvcoutinho

또 다른 질문 : JBoss Cache가 좋은 해결책이라고 생각하십니까? Apache Shiro (및 세션 클러스터링)에 대해 들어 보셨습니까? 어때요?
rvcoutinho

@rvcoutinho 응용 프로그램 개발자가 Linux 커널에서 프로세스를 관리하는 방법을 결정합니까? 그것은 비슷한 질문의 틀입니다. 그렇습니다. 그렇게 할 수는 있지만 극단적으로 어려워 대체 경로를 취하는 것보다 더 많은 고통을 줄 것입니다.
Gary Rowe

2
@rvcoutinho 나는 Apache Shiro (일명 Apache Security)를 사용하지 않았지만 공유 보안 문제에 대한 좋은 해결책이라고 생각합니다. 동일한 것을 달성하기 위해 자체 프로토콜을 롤링하는 대신 OpenID 및 OAuth2와의 통합을 확실히 고려하십시오. JBoss Cache는 데드 엔드 (dead end)에서 자체적으로 승인되어 Infinispan으로 대체되며 다소 복잡해 보입니다. 더 간단하고 확장 가능한 솔루션을 엿볼 수 있는 Twelve-Factor App 사이트 를 살펴볼 수 있습니다.
Gary Rowe

2

JEE EAR 사양에는 EAR 내에 바운드 된 여러 웹 아카이브에서 웹 세션을 공유 할 수있는 기능이 누락 된 것 같습니다.

Weblogic과 같은 앱 서버에는이 기능에 대해 비표준 구현이 있습니다.


그것은 지금까지 나의 의견이었다. 언급 된 선택이 왜 이루어 진지 이해하려고 노력했습니다.
rvcoutinho

1

AFAIKS, 당신이 이것을하고 싶은 진짜 이유는 없습니다. WAR은 자체 (웹 응용 프로그램 특정) 범위 (예 : 세션 범위)가있는 자체 포함 된 웹 응용 프로그램입니다. 기능 (Java 코드, JSP 페이지, CSS 파일)을 공유해야하는 경우 여러 WAR간에 JAR 파일로 패키징하고이를 애플리케이션 서버에 배치하는 것이 훨씬 현명한 옵션입니다. WAR 패키지는보다 복잡한 패키징 솔루션이며 간단한 "공통 코드 / 기능"과 다른 것을 캡슐화하도록 설계되었습니다. JAR은 더 간단한 형식이며 코드와 기능을 패키징하고 공유하도록 설계되었습니다. 더 단순하고 더 적합한 패키지 형식을 이미 사용할 수있는 경우 더 복잡하고 구체적으로 설계되지 않은 패키지를 사용하여 무언가를 공유하려는 이유는 무엇입니까?


동의합니다. 그러나 일반 자원에 관한 한. 그러나 싱글 사인온 (SSO) 응용 프로그램의 경우 세션 별 정보 (로그인 된 사용자에 대한)를 공유해야합니다. 그리고 이것이 이것이 사양에 위배되는 이유는 없습니다.
rvcoutinho

2
세션 범위는 다른 응용 프로그램간에 현재 사용자 데이터를 공유하지 않습니다. 그리고 SSO는 세션 범위 속성을 검사하는 것 이상을 의미합니다. 필터 외부에서 원하는 경우 세션 범위 속성에 액세스하는 코드를 전쟁 외부 (및 전쟁에 의존하지 않고 전쟁에 의존하는 코드)로 만들고 패키지화 할 수 있지만 더 나은 솔루션 IMHO는 인증을 처리하고 다른 (전 구축 된) 응용 프로그램에 대한 액세스 권한을 부여하는 별도의 파사드 응용 프로그램 또는 서버 구성을 갖습니다.
Shivan Dragon

다시 당신에게 동의합니다. 그러나 JavaEE 스펙 (JAAS 사용)은 HttpSession의 일부로 사용자 정보를 보유하므로이 방법과 반대입니다. 대신에 시로 (직교 세션을 유지)를 사용하는 이유 중 하나입니다.
rvcoutinho

어쨌든, 답변 주셔서 감사합니다. 나는 여전히 내 질문에 대한 명확한 답을 가지고 있지 않지만 당신이 말한 모든 것은 관련이 있습니다. +1
rvcoutinho

@ rvcoutinho 글쎄, 그 문제에 대한 나의 의견, 그것은 당신에게 더 도움이되지 않아서 죄송합니다.
Shivan Dragon

0

다른 웹 앱이 실수로 서로 세션 정보를 덮어 쓰지 않도록하기 위해 의도적으로 수행 된 것 같습니다. 귀하의 경우에는 유용 ​​할 수 있지만 일반적으로 사용자는 두 개의 웹 앱을 동시에 사용하기 때문에 앱이 충돌하거나 권한을 에스컬레이션하지 않기를 원합니다. 웹 앱간에 정보를 명시 적으로 공유하는 것은 어렵지 않습니다. 정적 HashMap으로 클래스를 만들고 GUID를 키로 사용하여 URL 또는 HTTP 매개 변수의 일부로 전송하십시오.


감사. 실제로, 나는 모든 응용 프로그램간에 전체 세션을 공유하는 것이 아니라 필요할 때 특정 세션 정보 (사용자 정보)를 이야기했습니다. 어쩌면 나는 명확하지 않았다. 더 명확하게하기위한 제안이 있으십니까?
rvcoutinho
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.