WEB개발

다른 도메인간 세션공유

스쿠터로세계일주 2013. 6. 4. 15:32

요즘 도메인을 하도 많이 사용하다 보니....세션공유할 일들도 많아졌다.


서브도메인끼리야...헤더 수정해주고..쿠키로 공유하면 되겠지만...전혀 다른 도메인끼리 공유하는건 골치가 아프다...아이프레임을 이용해서 로그인 즉시 아이프레임 으로 로그인정보를 쏴줘서 동시에 로그인 처리를 해주는 방법도 하나가 될 수도 있겠지만...개인적으론 DB를 이용하는걸 추천한다.


여기 저기 닥치는데로 소스 긁어서 현재 적용된 상태이다. 방법은 이렇다..


다른 도메인으로 페이지 이동시 DB에 세션정보를 저장하고, 불러올 페이지를 만들어서 그곳을 거쳐 다니는 것이다. 생각은 참 간단한데....이해하는데 너무 시간이 걸렸다...서브도메인공유는 쉬워는데..ㅠㅡㅜ


우선  aaa.com 에서 bbb.com으로 이동할때 aaa.com 에서 가진 세션정보를 bbb,com으로 가져가려면? 

파라미터를 이용해서 가져갈수도 있겠고...여러방법이 있겟지만, 차이는 단 하나다. 

임시저장을 어디에 하느냐!는것 그뿐이다. 난 DB를 선택했을..뿐이고~!!


aaa.com --> SessionTransfer.asp --> bbb.com 이런식이다.


반대는.. aaa.com <--  SessionTransfer.asp <-- bbb.com 이렇겠지...ㅋㅋ

a(aaa.com ) 에서 중계페이지(SessionTransfer.asp )로 이동할때 이동할 b(bbb.com) 의 url과 다른 도메인으로 넘어간다는 구분값을 가지고 넘어간다. 즉..

http://aaa.com/SessionTransfer.asp?dir=2b&url=/test.asp 요딴식이다..
dir변수는 b페이지로 넘어간다는의미이고, 그 값이 없다면 넘어왔다는 의미다.
url 은 bbb.com 도메인으로 넘어가서 bbb.com/test.asp 페이지로 가겠다는 의미다. 이 url 을 타고 이제 중계페이지로 넘어왔다....

중계페이지 역할은 현재의 세션정보를 DB에 저장하고, 페이지를 리디렉트 해주는 역할이다. 정보를 받는 도메인의 중계페이지는 DB에 저장된 세션정보를 읽어와서 세션에 넣어주고, 임시로 저장됐던 그 세션DB정보를 삭제하는 것이다. 그리고 이동하고자 하는 페이지로 리디렉트!

우선 다음단계 계속해서...
http://aaa.com/SessionTransfer.asp 페이지에서 할 일이다.

1. 우선 조건에 따라 작업이 달라진다. 
현재는 a에서 b로 넘어가려고 하기 때문에 dir파라미터값이 있다. 

If RQ("dir") = "2b" Then ' 디렉션 방향값이 있다는건, 현재세션을 다른 도메인에 옮기고 싶다는 의미..

guidSave = AddSessionToDatabase() '이 함수가 현재의 세션정보를 하나씩 쪼개서 DB에 입력하는 곳이다. 그 결과값(임시 아이디)을 받아서 guidSave에 담아 이동할 도메인으로 가져간다. 당연히 guidSave 값이 DB에 저장된 세션의 고유아이디가 된다. 즉 guidSave 값이 고유아이디인 모든 정보를 b도메인에서 불러서 세션에 저장하면 된다는것.

Response.Redirect("http://bbb.com/SessionTransfer.asp?dir=2b&guid=" + guidSave + "&url=" & Server.URLEncode(RQ("url"))) ' 넘겨받은 guidSave 값과 파라미터, 이동할 페이지를 받아서 b 사이트의 중계페이지로 넘어간다.

Else ' 이 부분은 디렉션 방향이 없다는건, 넘겨주는 역할이 아니라, 넘겨 받았을때 처리하는 영역이라는 것
Call GetSessionFromDatabase(RQ("guid"))

'Clean up the database
Call ClearSessionFromDatabase(RQ("guid"))
Response.Redirect(RQ("url"))

End If
 

2. 위와같이 현재세션을 DB에 저장하고, 저장한 데이터의 고유아이디를 받아서 B사이트로 넘겨주면 B사이트의 중계페이지 에서는 그 값을 받아서 DB에서 데이터를 불러들여 나온 키값과 value값을 세션에 그대로 저장해준다. 중계페이지의 소스는 위와 동일하다. 대신 리디렉트 방향만 바뀔뿐이다. aaa로 가는것으로...



If RQ("dir") = "2a" Then ' 여기선 반대로 aaa.com사이트로 갈때 조건이다. 하지만, 지금은 a에서 b로 넘어왔으니 이 조건은 패스~~

guidSave = AddSessionToDatabase() '

Response.Redirect("http://bbb.com/SessionTransfer.asp?dir=2a&guid=" + guidSave + "&url=" & Server.URLEncode(RQ("url"))) '

Else ' 이 중계페이지는 넘겨받은 페이지이므로, 이곳을 타고 조건을 수행한다.
Call GetSessionFromDatabase(RQ("guid")) '이름을 보면 알겠지만, 이 함수가 넘겨받은 고유값을 이용해서 DB에서 세션정보들을 불러오는 함수다. 그리고 불러온 레코드를 반복으로 돌려서 세션을 생성해준다.

'Clean up the database
Call ClearSessionFromDatabase(RQ("guid")) '이름대로, DB에 저장된 세션정보를 삭제해주는 쿼리다. 안그러면....세션정보가 엄청나게 쌓일꺼다... 그리고 무엇보다. 저장된 정보가 임시정보라는 것을 말해주는 것이다. 즉 DB에서 불러다 세션에 저장했으므로, DB에 입력된 정보는 쓸모가 없는거다. 매 페이지마다 그 세션정보를 읽어오고, 업데이트 하고 . 그렇게 사용하지 않는다는 것이다. 물론 그렇게 사용할 수도 있겠지만, 옳티않타....

Response.Redirect(RQ("url")) '세션을 생성해 주었다면, 이제 가고자 하는 페이지로 리디렉트 시켜준다. 물론 이 경우에는 B사이트의 페이지일 것이다.

End If


기본 흐름은...참 쉽지 아니한가?....맨땅헤딩으로 이해하려니...처음엔 어려웠다...
난 그 DB에 저장된 세션을 계속 사용하려고 하였고, 휘발성 데이터라는 생각을 갖지 못했다. 그리고 고유한 세션아이디를 계속 가지고 다니면서 그 테이블과 통신해야 하는줄 알았다..그러니 이해를 못했었다. 
핵심은 DB를 이용한 세션공유는 DB에 영구데이터를 넣는것이 아니라, 페이지 이동시 잠깐만 사용하고 지워버릴 휘발성 고유아이디와 데이터를 저장할 뿐이라는 것이다.  그것만 이해가 되면 참 쉬워진다. 

내가 참조한 소스를 첨부파일로 올리고..오늘의 정리...끝....ㄷ ㄷ ㄷ ㄷ ;;;


session_transfer.zip
0.0MB