2013-11-02 1 views
1

클라이언트가 쿠키를 차단할 때 세션 상태를 유지하는 제안 된 방법을 사용하여 보안 결함이 있는지 확인하려고합니다.세션 상태 클라이언트 IP 사용

일반적으로 UUID가 데이터베이스에 저장된 것과 일치하는 경우 쿠키와 자동 로그인에 UUID를 저장합니다. 그러나 클라이언트가 쿠키를 차단 한 경우 컴퓨터에서 UUID에 액세스 할 수 없으므로 IP 주소를 사용하여 데이터베이스와 일치하도록 해결해야합니다.

나는 사용하여 IP 주소를 확인 :

String ip = request.getHeader("X-FORWARDED-FOR"); 
if(ip == null) { 
    ip = request.getRemoteAddr(); 
} 

나는이 지역에서 작은 녹색 해요,하지만 난이 방법의 보안 결함이있을 수 있습니다 생각합니다. 예를 들어 사용자가 공용 Wi-Fi 네트워크 (커피 숍, 공항, 호텔 등)에서 애플리케이션에 액세스하면 공용 IP를 저장하고 해당 계정을 해당 IP에 일치시킵니다. 동일한 ip로 그들 뒤에있는 사람들은 로그 아웃을 특별히 기억하지 않는 한 그들의 계정에 액세스 할 수 있습니다. 어떻게 이것을 막을 수 있습니까? 나는 IP에 일치하는 것 외에 쿠키가 차단되었을 때 완전히 다른 접근법을 사용하는 것에 반대하지 않는다. 쿠키를 사용할 수 없을 때 사용자 로그인을 완전히 허용하지 않는 것 외에 다른 접근법이 무엇인지 확신 할 수 없습니다. 유일하게 진정한 보안 방법입니까?

UPDATE

T.J.을 바탕으로 Crowders는 최근 통계를 보면 2 %의 사용자가 쿠키를 차단 한 것으로 나타났습니다. 여러 가지 이유로 쿠키를 사용하기로 결정하고 쿠키가 차단되어 세션 상태를 관리 할 수 ​​없을 때 경고를 표시합니다.

답변

4

...하지만이 접근법에는 보안 결함이있을 수 있습니다. 예를 들어 사용자가 공용 Wi-Fi 네트워크 (커피 숍, 공항, 호텔 등)에서 애플리케이션에 액세스하는 경우 ...

그 뿐만이 아닙니다. 가정에서 무선 광대역을 사용하는 사람들은 모두 동일한 IP에서 온 것으로 보이므로 함께 사는 두 사람이 동시에 사이트를 사용하려는 경우 (다른 사람에게 권장 할 수 있음) 충돌합니다.

쿠키를 사용할 수없는 경우 모든 URL에 세션 ID를 넣는 이전 J2EE 기술을 사용할 수 있습니다. 이미 J2EE를 사용하고 있다면 URL에 ;jsessionid=token을 사용할이 기본 제공 지원 (HttpServletResponse#encodeURL 등)을 사용할 수 있습니다. 그렇지 않은 경우 쿼리 문자열 매개 변수를 사용하여 기술을 구현하는 것만 큼 간단합니다.

+0

querystring 메서드를 사용하면 북마크, 친구에게 전자 메일로 보내는 등의 문제가 발생합니까? – ryandlf

+0

@ryandlf : 예, 문제가 발생합니다. 그러나 이것은 쿠키없이 세션을 추적하는 유일한 방법입니다. 쿠키를 차단하는 사용자가 있습니까? 그들에 대한 관심은 충분합니까? –

+2

@ryandlf : 그렇습니다. 최소한 세션 ID가있는 책갈피가있는 사람들이 있습니다. 다음을 완화 할 수 있습니다. 존재하지 않는 세션의 토큰이 무시됩니다 (정상적으로 처리됨). 그리고 세션의 IP를 서버 측 세션 상태로 저장 한 다음 다른 IP에서 요청이 들어오는 경우 토큰을 무시하고 (토큰이 유효한 세션을위한 경우에도) 정상적으로 다시 처리합니다. –

2

서블릿 API를 사용하면 URL 재 작성을 사용하여 쿠키가없는 세션을 추적 할 수 있습니다 (지정된 세션의 앱을 가리키는 모든 URL에는 세션 ID가 포함됩니다). 당신은 몇 가지 규칙을 존중 경우에 자동으로 :

주 (링크, 이미지 또는 무엇 이건) URL을 생성 할 때 항상 HttpServletResponse.encodeURL()를 사용

  • 을 리디렉션 할 때

    • 항상 HttpServletResponse.encodeRedirectURL()를 사용을 그 JSTL의 <c:url>encodeURL()으로 전화합니다.

  • +0

    이 답변은 정확합니다. 나는 안으로 들어 왔기 때문에 다른 것을 선택했다. – ryandlf