복붙노트

[SPRING] 자바 웹 세션 처리 방법에 대한 혼란. Servlet API와 Http Session 객체를 사용하여 쿠키와 헤더의 차이점 파악하기

SPRING

자바 웹 세션 처리 방법에 대한 혼란. Servlet API와 Http Session 객체를 사용하여 쿠키와 헤더의 차이점 파악하기

스프링 보안과 스프링 MVC를 배우고 있는데, 자바 환경에서 jsp Servlets과 일반적인 웹 프로그래밍을 배워야한다는 것을 깨달았다.

나는 HttpServletRequest와 HttpServletResponse 객체를 둘러싼 혼란 스러움과 요청과 응답 객체에 헤더를 추가하는 방법과 세션과의 관계를 어떻게 사용하는지 혼란 스럽다.

내가 아는 한, 쿠키는 Content-type 및 Accept와 같은 헤더 유형입니다. 자바 서블릿 API를 사용하면 헤더가 사용되는 컨텍스트에 특정한 메소드를 사용하여 헤더로 작업하기가 쉽습니다. 예 :

response.setContentType(String mimeType)
response.setContentLength(int lengthInBytes)

내 혼란은 여기에서 시작됩니다 .. 쿠키는 문자열이나 int, 그 객체가 아닙니다 :

response.addCookie(Cookie cookie)
response.getCookies()

쿠키는 헤더 형식이기 때문에 다음과 같이 사용할 수는 없습니다.

String cookieVal = response.getHeader("cookie")

세션 관리를 이해하는 데 어려움을 겪고 있는데 HttpServletRequest 및 HttpServletResponse API와 관련이 있습니다. HttpSession 객체는 무엇입니까?

HttpSession.getAttribute() // What is this getting??
HttpSession.setAttribute("Bla Bla", "valuetoset") // What is this setting?

해결법

  1. ==============================

    1.쿠키를 설명하는 RFC 및 관련 헤더, Set-Cookie 및 Cookie를 읽고 이해할 수 있습니다.

    쿠키를 설명하는 RFC 및 관련 헤더, Set-Cookie 및 Cookie를 읽고 이해할 수 있습니다.

    쿠키와 세션이 어떻게 관련되어 있는지 자세히 알고 싶다면 Servlet Specification의 7 장을 읽으십시오.

    먼저 HTTP가 상태 비 저장 프로토콜임을 이해해야합니다. 즉, 클라이언트가하는 각 요청은 이전 또는 이후의 요청과는 관계가 없습니다. 그러나 사용자로서 웹 애플리케이션과 상호 작용할 때 어떤 상태가 필요합니다. 예를 들어, 은행 애플리케이션은 거래를보고 관리 할 수 ​​있기를 원합니다. 음악 스트리밍 웹 사이트는 이미 들었던 것을 기반으로 좋은 박자를 추천하고자 할 수 있습니다.

    이를 달성하기 위해 쿠키 및 세션 개념이 도입되었습니다. 쿠키는 키 - 값 쌍이지만 특정 형식이 있습니다 (링크 참조). 세션은 서버와 클라이언트간에 여러 요청 / 응답에 걸쳐있는 정보를 저장하는 (메모리에 저장되거나 지속됨) 서버 측 엔터티입니다.

    Servlet HTTP 세션은 JSESSIONID 이름의 쿠키와 세션을 식별하는 값을 사용합니다.

    Servlet 컨테이너는 HttpSession 오브젝트와이 식별자의 맵 (YMMV)을 유지합니다. 클라이언트가 처음 요청을하면 서버는 고유 한 식별자로 HttpSession 객체를 만들고이를 맵에 저장합니다. 그런 다음 Set-Cookie 헤더를 응답에 추가합니다. 쿠키의 이름을 JSESSIONID로 설정하고 그 값을 방금 생성 한 식별자로 설정합니다.

    이것은 서버가 사용하는 가장 기본적인 쿠키입니다. 원하는 정보로 원하는 수만큼 설정할 수 있습니다. Servlet API를 사용하면 HttpServletResponse # addCookie (Cookie) 메소드를 사용하면 좀 더 간단 해 지지만 HttpServletResponse # addHeader (String, String) 메소드를 사용하면 직접 할 수 있습니다.

    클라이언트는 이러한 쿠키를 수신하여 일반적으로 텍스트 파일에 저장할 수 있습니다. 서버에 새 요청을 보낼 때 요청의 쿠키 헤더에있는 해당 쿠키를 사용하여 이전 요청을했을 수도 있음을 서버에 알릴 수 있습니다.

    서블릿 컨테이너는 요청을 받으면 Cookie 헤더 값을 추출하고 JSESSIONID 쿠키의 키를 사용하여 맵에서 HttpSession 객체를 검색하려고 시도합니다. 그런 다음이 HttpSession 객체는 Servlet 컨테이너가 생성하고 Servlet에 전달하는 HttpServletRequest 객체에 연결됩니다. setAttribute (String, Object) 및 getAttribute (String) 메서드를 사용하여 상태를 관리 할 수 ​​있습니다.

  2. ==============================

    2.쿠키가 헤더를 사용하여 관리되는 것이 맞습니다. 두 가지 쿠키 관리 관련 헤더가 있습니다 : 쿠키 및 세트 - 쿠키.

    쿠키가 헤더를 사용하여 관리되는 것이 맞습니다. 두 가지 쿠키 관리 관련 헤더가 있습니다 : 쿠키 및 세트 - 쿠키.

    쿠키 헤더는 사용자 에이전트 (브라우저)가 보내고 HttpServletRequest 객체에서 사용할 수 있으며 addCookie (쿠키)와 같은 메소드를 사용할 때 Set-Cookie 헤더가 HttpServletResponse 객체에 추가됩니다.

    Java에서 첫 번째 요청이 응용 프로그램에 도달하면 HttpSession이 설정됩니다. 컨테이너 (Jetty, Tomcat, WebSphere 등)의 Servlet Spec 구현은 HttpSession을 생성하고 관리합니다. 브라우저는 나중에이 특정 세션을 식별 할 JSESSIONID 쿠키를 수신합니다.

  3. ==============================

    3.위에서 주어진 대답에 동의하면서 쿠키와 세션은 웹 세계에서 두 개의 다른 실체라고 결론을 맺습니다.

    위에서 주어진 대답에 동의하면서 쿠키와 세션은 웹 세계에서 두 개의 다른 실체라고 결론을 맺습니다.

    쿠키는 서버에 의해 생성되고 클라이언트 (브라우저)에 저장된 간단한 정보를 나타냅니다. HTTP 메카니즘에 따르면, 브라우저는 브라우저가 이전에 보낸 모든 쿠키 (만료되지 않은 쿠키)를 보내야합니다.

    HTTP는 상태 비 저장 프로토콜입니다. FTP와 다른 프로토콜과 달리, 여러 요청 - 응답 트랜잭션간에 연결 상태가 보존되는 경우 HTTP 요청에서 하나의 요청에 대해 HTTP 연결이 설정되고 해당 요청에 대한 응답이 충족되면 닫힙니다. HTTP의이 결함은 정적 웹 페이지 만 제공하기 위해 초기에 설계 되었기 때문에 존재합니다. 그러나 웹이 확장되면서 이제는 동적 인 본격적인 웹 응용 프로그램을 제공하는 데 사용됩니다. 따라서 사용자를 식별해야합니다. 따라서 웹 서버가 제공하는 모든 요청에 ​​대해 각 요청의 사용자를 식별 할 수있는 레이블링 메커니즘이 필요합니다. 이 요청 사용자 식별 (요청이 동일한 사용자, 동일한 시스템에서 왔는지 여부), 세션이 사용됩니다. 웹 서버가 요청에서 사용자에 대한 정보를 수신 할 수있는 경우에만 세션을 성공적으로 구현할 수 있습니다. 이 정보를 사용자가 사용할 수있게 만드는 한 가지 방법은 쿠키입니다. 기타 URL 재 작성, 숨겨진 필드 등

    session.setAttribute ()는 클라이언트 측 (브라우저)이 아닌 서버 측의 현재 세션에 정보를 저장합니다.

    희망이 당신을 도울 수 있습니다.

  4. ==============================

    4.Ok 쿠키와 헤더의 차이점을보고 싶은 것 같습니다. 그들은 다른 목적을 가지고 있습니다. 쿠키는 클라이언트 쪽에서 정보를 임시로 저장합니다. 서버는 응답에 쿠키 (데이터)를 설정하고 일단 브라우저가 쿠키가 만료 될 때까지 각 후속 요청마다 이러한 쿠키 (데이터)를 보냅니다. 그러나 헤더는 브라우저와 서버에 대한 힌트로 사용됩니다. 예를 들어

    Ok 쿠키와 헤더의 차이점을보고 싶은 것 같습니다. 그들은 다른 목적을 가지고 있습니다. 쿠키는 클라이언트 쪽에서 정보를 임시로 저장합니다. 서버는 응답에 쿠키 (데이터)를 설정하고 일단 브라우저가 쿠키가 만료 될 때까지 각 후속 요청마다 이러한 쿠키 (데이터)를 보냅니다. 그러나 헤더는 브라우저와 서버에 대한 힌트로 사용됩니다. 예를 들어

    setHeader("Content-Type", "application/json");
    

    클라이언트에게 페이로드에서 json 응답을 볼 준비를하도록 알립니다. "일회성"정보이므로 쿠키와 같은 새로운 요청이있을 때마다 브라우저에 정보를 다시 보낼 필요가 없습니다.

  5. from https://stackoverflow.com/questions/19896730/confusion-about-how-java-web-session-handeling-works-demystifying-cookies-and-h by cc-by-sa and MIT license