programing

HTTP GET 요청에 탭별 데이터 바인딩

muds 2023. 9. 18. 22:47
반응형

HTTP GET 요청에 탭별 데이터 바인딩

브라우저 탭마다 다른 사용자로 로그인할 수 있는 인증 메커니즘을 구현하려고 합니다.

이 시스템의 규칙은 다음과 같습니다.

  • 인증 토큰은 로그인한 사용자를 나타냅니다.
  • 인증 토큰에는 프라이빗과 퍼블릭 두 가지가 있습니다.
  • 각 개인 토큰은 단일 탭에 바인딩되며 계정 정보를 결정합니다.
  • 공개 토큰은 모든 탭에서 읽고 쓸 수 있으며 마지막으로 로그인한 계정(모든 탭)을 나타냅니다.
  • 사용자가 탭에서 로그아웃하면 개인 및 공개 토큰이 모두 제거됩니다.
  • 탭이 인증이 필요한 페이지를 누를 때마다 시스템은 개인 토큰을 읽으려고 합니다.설정되지 않은 경우(새로 만들기/빈칸 탭의 경우), 공용 토큰의 값을 개인 토큰으로 복사합니다.공용 토큰이 설정되어 있지 않으면 인증 화면으로 리디렉션됩니다.
  • 탭이 이미 로그인되어 있고 사용자가 링크를 클릭할 때 요청은 사용자 지정 HTTP 헤더에 개인 토큰을 포함해야 합니다.URI에서 이 정보를 보내는 것은 보안상의 이유로 선택사항이 아닙니다.
  • 일반 링크와 동일하게 뒤로 가기/뒤로 가기 버튼을 사용하는 기능(즉, 양식 데이터를 다시 제출하라는 메시지가 표시되지 않음).

지금까지 시도한 것:

  • 을 해서.cookies개인 토큰과 공개 토큰 모두: 서버는 어떤 쿠키를 찾을지 알 수 없기 때문에 작동하지 않습니다.사용자가 탭 내부에서 링크를 클릭할 경우, 요청은 모든 탭에 걸쳐 모든 쿠키를 전송하고 서버는 어떤 쿠키가 링크를 클릭했는지 알 방법이 없습니다.

  • 을 에 저장sessionStorage할 때 보낼 할 수 때문에 . 사용자가 링크를 클릭할 때 HTTP GET 요청과 함께 전송해야 하는 사용자 지정 헤더를 지정할 수 없기 때문에 이 방법은 작동하지 않습니다.

  • AJAX를 사용하여 페이지를 요청한 다음 Data URI를 사용하여 메모리의 페이지로 이동: 보안상의 이유로 Internet Explorer에서는 HTML 컨텐츠에 DATA URI를 사용할 수 없습니다.http://msdn.microsoft.com/en-us/library/cc848897%28v=vs.85%29.aspx 참조

  • 을 해서.<form method="get" enctype="multipart/form-data">숨겨진 필드를 사용하여 토큰을 전달합니다. entype="typart/form-data"는 POST에 대해서만 지원됩니다.

  • 을 해서.<form method="post" enctype="multipart/form-data">숨겨진 필드를 사용하여 토큰을 전달합니다. 이론적으로는 이것이 작동해야 하지만 이제 사용자가 뒤로 가기/뒤로 가기 버튼을 사용할 경우 양식 데이터를 다시 입력하라는 메시지가 나타납니다.

  • AJAX를 AJAX를 사용하여 합니다.document.open(); document.write(); document.close(). 저는 http://forums.mozillazine.org/viewtopic.php?p=5767285&sid=d6a5a2e8e311598cdbad124e277e0f52#p5767285 과 https://stackoverflow.com/a/4404659/14731 둘 다 시도해 보았고 두 경우 모두 새로운 스크립트를 사용해 보았습니다.<head>블록은 실행되지 않습니다.

무슨 생각 있어요?

여러 번의 반복 작업을 거친 결과 다음과 같이 구현할 수 있었습니다.

변수

  • 데이터 저장소에는 두 가지 종류가 있습니다.
    • 모든 탭에서 공유되는 인덱싱된 DB.
    • session탭마다 고유한 스토리지.
  • 다음 변수를 저장합니다.
    • 에 DB 됨 됨 포함publicToken,nextTabId.
    • 에는 session 이 에 됩니다 됩니다 이 에 privateToken,tabId.

퍼블릭토큰,프라이빗상품권

  • 인증 토큰의 정의는 https://stackoverflow.com/a/1592572/14731 을 참조하십시오.
  • 인증 토큰에는 공개 토큰과 비공개 토큰 두 가지가 있습니다.
  • publicToken은 마지막 로그인 작업으로 반환된 토큰으로, 모든 탭에 걸쳐 표시됩니다.
  • privateToken는 현재 탭의 마지막 로그인 작업에 의해 반환되는 토큰입니다.

tabId

  • 하게 은 과 으로 하게 됩니다 됩니다 하게 으로 은 tabId.
  • nextTabId는 모든 탭에서 액세스할 수 있는 숫자입니다.
  • ID 를 ID ID 으로 을 에 를 에 으로 nextTabId그리고 그 가치를 높여줍니다.
  • 를 들면 ,tabId"com. company.Tab" 값을 가질 수 있습니다.X여기서 " X에 의해 반환된 번호입니다.nextTabId.

로그인/로그아웃

  • 마다 이 마다 할 privateToken그리고.publicToken서버에서 반환된 인증 토큰을 사용하여 덮어씁니다.
  • 하면 ㅇㅇㅇ을 합니다.privateToken그리고.publicToken에서, 고,고privateToken서버 쪽에서.는 .publicToken서버 쪽에서.
  • 은 탭이한 , 이, , 합니다를 한다는 것을 합니다.privateToken로그아웃됩니다.다른 토큰을 사용하는 모든 탭은 영향을 받지 않습니다.
  • 한 이 한 한 를 공유할 때privateToken탭에서 는 ? 에서 를 는 나 는 을 상속합니다.privateToken선택할 수 있습니다.
  • 가 ㅇㅇㅇ을 한다면.publicToken에서,이로 privateTokenx,publicToken는 Y해이다로로 탭을 시킵니다.privateToken로그아웃하려면 Y(바람직하지 않음).

페이지로드시

  • HTML 링크를 찾기 위해 페이지를 스캔합니다.
  • 링크에 에 를 a 합니다를 합니다.tabIdURL에 대한 쿼리 매개 변수입니다.은 Δ Δ Δ Δ Δ 값과 .tabId.
  • 옷을 벗기tabIdhistory.replaceState()사용하여 현재 페이지의 URL 매개 변수를 지정하여 사용자가 친구와 링크를 공유할 수 있도록 합니다.tabId사용자별이므로 공유할 수 없습니다.
  • 합니다를 합니다.tabIdcookie (이에 대한 자세한 내용은 아래에 있음).

링크 클릭 시

  • 에서 이 됩니다를 .tabId쿠키를 만들고 링크를 따라갑니다.
  • 은 의 은 과 과 .tabId과한값값한 값과 한 값.privateToken

서버가 요청을 수신할 때

  • tabId 변수가개음다를된로가로다를er음개된가osn 로 리디렉션합니다.GetTabId.html?referer=XXURL입니다는재 URL 입니다.
  • 한다면tabId존재하지만 인증 토큰이 잘못되었거나 만료되었습니다. 브라우저를 로그인 화면으로 리디렉션합니다.

GetTabId.html

  • 에 에 이 이 없을 경우privateToken,알았다.publicToken안으로privateToken.
  • 둘다 ㅇㅇprivateToken그리고.publicToken정의되지 않았습니다. 로그인 페이지로 리디렉션합니다.
  • 는 에서 URL 를 합니다 합니다 를 이라는 URL 매개 변수를 사용합니다.referer성공할 경우 어디로 리디렉션할지 나타냅니다.
  • 탭에 다음 항목이 있는 경우privateToken 덧붙이다, tabId 변수를한개수에o수erreferer페이지를 호출한 후 다시 해당 페이지로 리디렉션합니다.
  • 사용하다window.location.replace()할때때 제거하도록 때GetTabId.html브라우저 기록에서 확인할 수 있습니다.

쿠키를 계속 삭제/추가하는 이유는 무엇입니까?

  • 우리는 각 요청에 따라 서버로 전송되는 쿠키의 수를 최소화하려고 노력합니다.
  • 만약 우리가 삭제하지 않았다면.tabId쿠키가 페이지 로드되면 탭에서 요청할 때마다 다른 탭의 쿠키도 모두 전송됩니다.

알려진 문제

  • Source는 "View Source"가 누락된 . "View Source"는 URL입니다.tabId . .로.GetTabId.html실제 페이지 대신에
  • 어색하게 긴 페이지 다시 로드(클라이언트가 로 리디렉션됨)GetTabId.html(그리고 원래 페이지로 돌아갑니다).

구현 세부 사항이 길어져 죄송합니다만, 더 쉽고 짧은 해결책을 찾을 수 없었습니다.

언급URL : https://stackoverflow.com/questions/26556749/binding-tab-specific-data-to-an-http-get-request

반응형