도와주세요

세션연동부분에 대하여 도움이 필요합니다.

Hanam092019.01.21 17:18조회 수 51댓글 2

    • 글자 크기


안녕하세요 hanam09입니다.


웹사이트를 만드는데 최적화 부분에서 걸림돌이 있어 이렇게 질문드립니다.


Q. 서로 다른 도메인간 세션연동부분에 대하여.

    

    참고: https://blog.ihnkyou.gq/post/59f66c5589d0bc674ab85f34d1dd3ef6

           

<!DOCTYPE html>
<html>
<head>
  <title>Thinking Cell - Blog/view</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width,initial-scale=1.0">
  <script type="text/javascript" src="https://api.ihnkyou.gq/api/module.js?module=xmlHttp"></script>
  <script type="text/javascript" src="https://api.ihnkyou.gq/api/module.js?module=base64"></script>
  <script type="text/javascript" src="https://api.ihnkyou.gq/api/module.js?module=clientInfo"></script>
  <script type="text/javascript" src="https://api.ihnkyou.gq/api/module.js?module=PushCtrl"></script>
  <script type="text/javascript">document.domain = "ihnkyou.gq";var post = this.location.pathname.replace("/post/","");</script>
</head>
<body>
  <div class="header">
    <div class="sides">
      <a href="/" class="logo">BLOG</a>
    </div>
    <div class="sides"><label><a class="menu"></a><input type="checkbox" id="Open" hidden></label></div>
    <div class="info">
    <h4><a href="#category">Honesty, morality, justice</a></h4>
      <h1>내 중심의, 나를 위한, 나의 블로그</h1>
    </div>
  </div>
  <section class="content">
    <div id="post">
      <div id="post_container">
        <h2 id="post_head">포스트를 찾을 수 없습니다!</h2>
        <div id="post_body">Post ID에 일치하는 경로가 없습니다.</div>
        <span id="post_lastUpdateTime" class="footer"></span>
        <span id="r" class="footer" onclick="SyncSess()">삭제</span>
      </div>
      <div id="post_comments">
        <div id="form-top">
          <input type="text" style="border-radius: 4px;border: 1px solid gray;" id="Customer" placeholder="Your Name"><span>한개의 게시글당 한개의 댓글만 작성가능합니다. 게시글에 중복작성할 경우 기존의 댓글이 갱신됩니다.</span>
        </div>
        <div class="Card_Comment_Send"><div class="Card_SendOpinion"><textarea></textarea><div class="btn-submit" onclick="Comment_Send(this.parentNode.children[0].value,document.getElementById('Customer').value)">입력</div></div></div>
        <hr>
      </div>
    </div>
  </section>
  <!-- post,Comment style -->
  <style type="text/css">
    #form-top {
      text-overflow: ellipsis;
      white-space: nowrap;
      overflow: hidden;
    }
    #post {
      border: 1px solid #bdc3c7;
      padding: 15px;
    }
    .footer {
      position: relative;
      bottom: -100px;
    }
    #r {
      float: right;
    }
    #post_container {
      margin-bottom: 100px;
    }
    .cmt_wrotetime {
      float: right;
    }
    .comment {
      border: thin solid #2c3e50;
      border-radius: 4px;
      padding: 2%;
      margin-top: 25px;
    }
    textarea {
      height: 60px;
      width: 93%;
      display: block;
      resize: none;
    }
    .btn-submit {
      padding: 20px 20px 0 20px;
      float: right;
      background-color: #3498db;
      color: #ffffff;
      cursor: pointer;
    }
    .Card_SendOpinion {
      width: 100%;
      display: flex;
    }
  </style>
    <!-- Comment Send -->
  <script type="text/javascript">
    function Comment_Send(comment,name) {
      if (comment.trim()==="") {
        window.alert("내용을 입력하여 주세요.");
        return null;
      } else {
        AJAX({
          "url" : "https://blog.ihnkyou.gq/api/Comment",
          "method" : "POST",
          "data" : "identity="+Base64.Encode(Client.IPAddress)+"&comment="+encodeURI(comment)+"&post="+post+((name.trim() === "")?(""):("&Nick="+encodeURI(name))),
          "Callback" : function() {
            if (this.status == 200&&this.readyState==4) {
              location.reload();
            }
          },
          "headers" : {
            "content-type" : "application/x-www-form-urlencoded; charset=utf-8"
          }
        });
      }
    }
  </script>
  <!-- getPost by id -->
  <script type="text/javascript">
    function ReadPost() {
      AJAX({
        "url" : "/api/posts.json",
        "method" : "GET",
        "data" : null,
        "Callback" : function() {
          if (this.readyState === 4&&this.status === 200) {
            var postData = JSON.parse(this.response)[post];
            if (postData===undefined) {
              document.getElementById("post_comments").hidden = true;
              return;
            }
            document.getElementById("post_head").innerText = postData.subject;
            document.getElementById("post_body").innerHTML = postData.content;
            document.getElementById("post_lastUpdateTime").innerText = postData.time;

            for (var i = Object.keys(postData.comments).length - 1; i >= 0; i--) {
              if (Object.keys(postData.comments)[i] === Base64.Encode(Client.IPAddress)) {
                if (postData.comments[Object.keys(postData.comments)[i]][2]===undefined) {
                  AddComment(Object.keys(postData.comments)[i]+"(You)",postData.comments[Object.keys(postData.comments)[i]][1],postData.comments[Object.keys(postData.comments)[i]][0])
                } else {
                  AddComment(postData.comments[Object.keys(postData.comments)[i]][2]+"(You)",postData.comments[Object.keys(postData.comments)[i]][1],postData.comments[Object.keys(postData.comments)[i]][0])
                }
              } else {
                if (postData.comments[Object.keys(postData.comments)[i]][2]===undefined) {
                  AddComment(Object.keys(postData.comments)[i],postData.comments[Object.keys(postData.comments)[i]][1],postData.comments[Object.keys(postData.comments)[i]][0])
                } else {
                  AddComment(postData.comments[Object.keys(postData.comments)[i]][2],postData.comments[Object.keys(postData.comments)[i]][1],postData.comments[Object.keys(postData.comments)[i]][0])
                }
              }
            }
          }
        }
      })
    }
    function AddComment(User,Time,Cmt) {
      var pas = new DOMParser();
      var Template = '<div class="comment"><div class="comment_header"><span class="cmt_name"></span><span class="cmt_wrotetime"></span></div><p class="cmt_body"></p></div>';
      var html = document.createElement("div");
      var header = document.createElement("div");
      var name = document.createElement("span");
      var w_time = document.createElement("span");
      var c_body = document.createElement("p");
      html.className = "comment";
      header.className= "comment_header";
      name.className= "cmt_name";
      w_time.className="cmt_wrotetime";
      c_body.className="cmt_body";
      name.innerText = User;
      w_time.innerText = Time;
      c_body.innerText = Cmt;
      html.appendChild(header)
      header.appendChild(name);
      header.appendChild(w_time);
      html.appendChild(c_body);
      document.getElementById("post_comments").appendChild(html);
    }
    ReadPost();
  </script>
  <!--Remove Post-->
  <script type="text/javascript">
    function SyncSess() {
      AJAX({
        "url" : "https://gift.ihnkyou.gq/engine/App_blog/sync.php",
        "method" : "GET",
        "withCredentials" : true,
        "data" : null,
        "Callback" : function() {
          if (this.readyState==4&&this.status==200) {
            PushCtrl(JSON.parse(this.response))
          }
        }
      });
    }
    function unPost() {
      AJAX({
        "url" : "/api/unpost",
        "method" : "POST",
        "headers" : {
          "content-type" : "application/x-www-form-urlencoded; charset=utf-8"
        },
        "data" : "post="+post,
        "Callback" : function() {
          if (this.readyState == 4&&this.status==200) {
            PushCtrl(JSON.parse(this.response));
          }
        }
      })
    }
  </script>
    <!-- Rendering blog style -->
  <style type="text/css">@import "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css";@import "https://fonts.googleapis.com/css?family=Josefin+Sans:400,400i,600,600i";html,body{margin:0;height:120%;font-family:"Josefin Sans",sans-serif}.header{position:relative;overflow:hidden;display:flex;flex-wrap:wrap;justify-content:center;align-items:flex-start;align-content:flex-start;height:50vw;min-height:400px;max-height:550px;min-width:300px;color:#eee}.header:after{content:"";width:100%;height:40%;position:absolute;bottom:0;left:0;z-index:-1;background:linear-gradient(to bottom,rgba(0,0,0,0) 0%,rgba(27,32,48,1) 100%)}.header:before{content:"";width:100%;height:100%;position:absolute;top:0;left:0;-webkit-backface-visibility:hidden;-webkit-transform:translateZ(0) scale(1,1);transform:translateZ(0);background:#1b2030 url(https://unsplash.it/1999/999?image=1063) top center no-repeat;background-size:cover;background-attachment:fixed;animation:grow 60s linear 10ms infinite;transition:all .2s ease-in-out;z-index:-2}.header a{color:#eee}.menu{cursor: pointer;display:block;width:30px;height:30px;border:2px solid #fff;border-radius:3px;position:absolute;right:20px;top:20px;text-decoration:none}.menu:after{content:"";display:block;width:20px;height:3px;background:#fff;position:absolute;margin:0 auto;top:5px;left:0;right:0;box-shadow:0 8px,0 16px}.logo{border:2px solid #fff;border-radius:3px;text-decoration:none;display:inline-block;margin:20px;padding:5px 10px;font-weight:600;font-size:1.2em;box-sizing:border-box}.sides,.info{flex:0 0 auto;width:50%}.info{width:100%;padding:15% 10% 0;text-align:center;text-shadow:0 2px 3px rgba(0,0,0,0.2)}.author{display:inline-block;width:50px;height:50px;border-radius:50%;background:url(http://favim.com/media/uploads/images/610/140308/black-n-white-cute-funny-iron-man-Favim.com-1462744.jpg) center no-repeat;background-size:cover;box-shadow:0 2px 3px rgba(0,0,0,0.3);margin-bottom:3px}.info h4,.meta{font-size:.7em}.meta{font-style:italic}@keyframes grow{0%{transform:scale(1)}50%{transform:scale(1.2)}}.content{padding:5% 10%;text-align:justify}.btn{color:#333;border:2px solid;border-radius:3px;text-decoration:none;display:inline-block;padding:5px 10px;font-weight:600}.twtr{margin-top:100px}.btn.twtr:after{content:"\1F426";padding-left:5px}</style>


</body>
</html>





보시다시피.... 포스트를 불러오는걸 모두 클라이언트에서 합니다.


문제는 그게 아니라 조오~기 삭제버튼을 누르면 삭제가 되어야 합니다.

단, 관리자권한을 가진 사람만요.


그러기 위해서 저는 관리자페이지(다른도메인)에서 크로스 오리진 요청을 허용해두고 

블로그에서 관리자페이지에 세션 동기화 요청을 하면 관리페이지에서 세션쿠키값을 넘겨줍니다.

https://gift.ihnkyou.gq/engine/App_blog/sync.php

{
"App": "Sync Session",
"CustomKit" : {
"Session" : "sess_key=4gdvt83l9rv6fhbsppsegqs2h4"
},
"do" : "AJAX({\"url\" : \"/api/sync\",\"method\" : \"POST\",\"headers\" : {\"content-type\":\"application/x-www-form-urlencoded; charset=utf-8\"},\"data\": PushCtrl.kit.Session,\"Callback\" : function(){if(this.readyState==4&&this.status==200){unPost();}}})"
}


이런식으로요.


저 CustomKit안에 세션키 보이시죠?

저걸 받으면 저 밑에 JSON에 버젓이 막혀있는 스크립트코드를 실행합니다.


저 코드는 "AJAX요청을 생성하고 이 도메인의 /api/sync/로 관리자 페이지로부터 받은 세션값을 보내고 요청이 완료되면  unpost함수를 실행하라"라고 하는겁니다.

api/sync 경로에는 클라이언트로부터 받은 값을 세션id로 적용시켜서 관리자페이지와 블로그페이지의 세션값을 동일하게 합니다.

근데 이렇게하면 나중에 보수할때 더 힘들어 지는것으로 알고있고 성능도 문제가 있을 수 있을것 같습니다.

더 나은 방법이 있을까요?





 

안녕!

 

    • 글자 크기
PHP 순서 매기기 (by joyful) Input submit 버튼 (by Piedots)
  • 2019.1.21 19:56

    SSO에 대해서 검색해보시면 해당 내용에 대해서 도움이 될 수 있을 것 같네요.

  • @humit
    Hanam09글쓴이
    2019.1.21 22:05

    감사합니다 humit님,

     

    http://wiki.wikisecurity.net/wiki:sso

    이제야 정확히 알겠네요..^^

댓글 달기

번호 제목 글쓴이 날짜 조회 수
공지 회원 전용 페이지가 생겼습니다.15 마스터 2018.03.20 5392
공지 [필독] 질문하는 방법5 마스터 2018.02.23 722
540 앱에서의 MIT라이센스 표시 관련하여 질문합니다.4 title: 에그joyful 2019.02.19 48
539 그누보드 5 설치 오류 도와주세요3 김호창 2019.02.15 86
538 TXT레코드 관련 도와주세[요!7 AA 2019.02.14 96
537 라이믹스 ckeditor42 캣치 2019.02.13 67
536 SQL문을 PHP에서 실행시켰는데 안되네요7 Piedots 2019.02.11 71
535 [Python 질문] 재귀함수의 알고리즘이 잘 이해가 되지 않습니다.13 맛스타 2019.02.09 154
534 하천 복개 공사가 서버에 영향을 미칠까요?4 이니스프리 2019.02.09 70
533 미국 간편식 추천 부탁드립니다14 이니스프리 2019.01.29 109
532 라엘 님의 이미지 캐시 서버 구축하기와 관련하여 구체적인 방법을 여쭤봅니다4 이니스프리 2019.01.27 105
531 일본어 '도키도키'의 뜻을 어떻게 해석해야 하나요?11 이니스프리 2019.01.26 128
530 아이폰8+ 네비 사용시 발열(?) 문제에 대한 해결책을 여쭤봅니다10 이니스프리 2019.01.26 109
529 파이썬 공부하다 모르는 부분이 있습니다.14 맛스타 2019.01.26 133
528 XE/php 질문 2가지 title: 만렙이 되어보자도토리묵 2019.01.25 47
527 trumbowyg 에디터를 그누보드 아미나빌더에 삽입중입니다.10 홀민 2019.01.25 95
526 PHP 순서 매기기3 title: 에그joyful 2019.01.23 53
세션연동부분에 대하여 도움이 필요합니다.2 Hanam09 2019.01.21 51
524 Input submit 버튼2 Piedots 2019.01.20 50
523 x-y넷에서 내 웹사이트에서 트래픽 사용 현황을 볼 수 있는 php소스가 있었습니다2 없음 2019.01.20 58
522 POST 데이터가 보내지지 않습니다5 Piedots 2019.01.20 64
521 도메인 포워딩이 제대로 이루어지지 않습니다.4 title: 애프터 이펙트제르엘 2019.01.20 62
이전 1 2 3 4 5 6 7 8 9 10... 27다음
첨부 (0)
서버에 요청 중입니다. 잠시만 기다려 주십시오...