Rails의 하위 도메인간에 세션 (쿠키)을 공유 하시겠습니까?


92

각 사용자가 회사에 속한 앱 설정이 있고 해당 회사에는 하위 도메인이 있습니다 (basecamp 스타일 하위 도메인을 사용하고 있습니다). 내가 직면 한 문제는 rails가 여러 쿠키 (lvh.me에 대해 하나와 subdomain.lvh.me에 대해 하나)를 생성하여 내 응용 프로그램에서 꽤 많은 중단을 유발한다는 것입니다 (예 : 모든 요청을 한 번만 전달해도 플래시 메시지가 지속됨). 로그인).

내 /cofig/initilizers/session_store.rb 파일에 다음이 있습니다.

AppName::Application.config.session_store :cookie_store, key: '_application_devise_session', domain: :all

도메인 : : all이 Google에서 찾은 표준 답변 인 것 같지만 저에게는 효과가없는 것 같습니다. 도움을 주시면 감사하겠습니다!

답변:


75

결과적으로 '도메인 : 모두'는 해당 세션 동안 방문한 모든 다른 하위 도메인에 대한 쿠키를 생성합니다 (그리고 요청간에 전달되도록 보장합니다). 도메인 인수가 전달되지 않으면 동일한 세션에서 방문한 모든 다른 도메인에 대해 새 쿠키가 생성되고 이전 쿠키는 삭제됩니다. 필요한 것은 도메인이 변경 되어도 세션 내내 지속되는 단일 쿠키였습니다. 따라서 합격 domain: "lvh.me"은 개발 문제 를 해결했습니다. 이렇게하면 서로 다른 하위 도메인간에 머무르는 단일 쿠키가 생성됩니다.

추가 설명이 필요한 사람에게는 훌륭한 링크입니다. http://excid3.com/blog/sharing-a-devise-user-session-across-subdomains-with-rails-3/


2
고마워 친구 .. 내 프로젝트 중 하나 에서이 문제에 직면했습니다 .. 마침내 해결책을 찾았습니다 ..
Shirjeel Alam

3
config.secret_key_base모든 애플리케이션 에서 동일하게 사용하십시오. 그렇지 않으면 쿠키를 디코딩 할 수 없습니다.
Bruno Buccolo 2014 년

6
Rails 4와 관련된 질문이 없습니다. 이것이 변경되었는지 알고 있습니까? 내 프로젝트에서 작동하도록 할 수 없습니다. 쿠키를 계속 재생성합니다. 감사.
Andy

CacheStorememcached에 세션을 저장하는 데 사용 하려면 어떻게해야 합니까?
Amit Patel

2
Rails4으로,이는 밑줄로 대시 하위 도메인에 근무하지만 발견 :Appname::Application.config.session_store :cookie_store, key: '_appname_session', domain: :all, tld_length: 2
user1515295

68

http://excid3.com/blog/sharing-a-devise-user-session-across-subdomains-with-rails-3/

"여기서주의하고 싶은 부분은 : domain => : all like를 일부 장소에서 권장하는 경우 localhost를 사용하지 않는 한 작동하지 않는다는 것입니다. : all 기본값은 1의 TLD 길이입니다. 즉, Pow (myapp.dev)로 테스트하는 경우 길이가 2 인 TLD이므로 작동하지 않습니다. "

즉, 다음이 필요합니다.

 App.config.session_store ... , :domain => :all, :tld_length => 2

쿠키를 지우는 것도 좋은 생각입니다.


1
하나의 변경이 모든 환경 (app.com 및 app.dev)에서 작동하기 때문에 이것이 가장 좋은 대답입니다. 맞춤형 미들웨어는 필요하지 않습니다. 쿠키를 지우는 것도 좋은 점입니다!
Turadg 2013

1
당신은 누락, :tld_length => 2
montrealmike

1
config.secret_key_base모든 애플리케이션 에서 동일하게 사용하십시오. 그렇지 않으면 쿠키를 디코딩 할 수 없습니다.
Bruno Buccolo 2014 년

4
:domain => :allRails 4에서 작동하지 않습니다 domain => 'lvh.me', tld_length = 2. 그것은 나를 위해 workd
호치민 Triet에게

1
Rails 4.2 domain: :all, tld_length: 2에서는 lvh.me도메인 을 사용하는 동안 좋은 결과를 얻었습니다 .
zwippie

24

도메인 이름을 명시 적으로 지정하지 않고도이 문제를 해결할 수있는 방법을 찾고 있었으므로 session_store.rb 파일을 계속 편집하지 않고도 localhost, lvh.me 및 프로덕션에서 사용할 도메인 사이를 이동할 수 있습니다. 그러나 "도메인 : : all"설정이 작동하지 않는 것 같습니다.

궁극적으로 해당 표현식에서 tld_length (최상위 도메인 길이)를 명시해야한다는 것을 알았습니다. 예를 들어, 기본 tld_length는 1이고 example.lvh.me의 tld_length는 2이고 127.0.0.1.xip.io의 tld_length는 5입니다. 그래서 개발중인 lvh.me의 하위 도메인에 대한 session_store.rb 파일에 포함 된 내용은 다음과 같습니다.

MyApp::Application.config.session_store :cookie_store, key: '_MyApp_session', domain: :all, tld_length: 2

이 답변을 찾는 데 오랜 시간이 걸렸으므로 누군가에게 도움이되기를 바랍니다.


19

어떤 이유로 :all도메인 교체 가 작동하지 않았습니다 (rails 3.2.11). 이를 고치기 위해 커스텀 미들웨어가 필요했습니다. 해당 솔루션에 대한 요약은 다음과 같습니다.

tl; dr : 맞춤형 랙 미들웨어를 작성해야합니다. 당신은 그것을 당신의 conifg/environments/[production|development].rb. 이것은 Rails 3.2.11에 있습니다.

쿠키 세션은 일반적으로 최상위 도메인에 대해서만 저장됩니다.

을 살펴보면 과 와에 Chrome -> Settings -> Show advanced settings… -> Privacy/Content settings… -> All cookies and site data… -> Search {yourdomain.com}대한 별도의 항목이 있음을 알 수 있습니다.sub1.yourdomain.comothersub.yourdomain.comyourdomain.com

문제는 모든 하위 도메인에서 동일한 세션 저장소 파일을 사용하는 것입니다.

1 단계 : 사용자 지정 미들웨어 클래스 추가

여기에서 Rack Middleware 가 등장합니다. 관련 랙 및 레일 리소스 :

여기에 추가해야 할 사용자 정의 클래스가 있습니다. lib 이것은 @Nader에 의해 작성되었으며 모두 감사해야합니다.

# Custom Domain Cookie
#
# Set the cookie domain to the custom domain if it's present
class CustomDomainCookie
  def initialize(app, default_domain)
    @app = app
    @default_domain = default_domain
  end

  def call(env)
    host = env["HTTP_HOST"].split(':').first
    env["rack.session.options"][:domain] = custom_domain?(host) ? ".#{host}" : "#{@default_domain}"
    @app.call(env)
  end

  def custom_domain?(host)
    host !~ /#{@default_domain.sub(/^\./, '')}/i
  end
end

기본적으로 이것이하는 일은 모든 쿠키 세션 데이터를 루트 도메인과 동일한 동일한 쿠키 파일에 다시 매핑하는 것입니다.

2 단계 : Rails 구성에 추가

이제 lib에 사용자 정의 클래스가 있으므로 자동로드되는지 확인하십시오. 아무 의미가 없다면 여기를보세요 : Rails 3 autoload

첫 번째는 쿠키 저장소를 사용하여 시스템 전체에 있는지 확인하는 것입니다. 에서 config/application.rb우리는 쿠키 저장소를 사용하도록 레일을 말한다.

# We use a cookie_store for session data
config.session_store :cookie_store,
                     :key => '_yourappsession',
                     :domain => :all

이것이 여기에 언급 된 이유는 :domain => :all선 때문입니다 . :domain => ".yourdomain.com"대신 지정하도록 제안한 다른 사람들이 있습니다 :domain => :all. 어떤 이유로 이것은 저에게 효과가 없었고 위에서 설명한 것처럼 사용자 정의 미들웨어 클래스가 필요했습니다.

그런 다음 config/environments/production.rb추가 :

config.middleware.use "CustomDomainCookie", ".yourdomain.com"

앞의 점이 필요합니다. 이유는 " 상위 도메인 요청에서 전송 된 하위 도메인 쿠키입니까? "를 참조하십시오 .

그런 다음 config/environments/development.rb추가 :

config.middleware.use "CustomDomainCookie", ".lvh.me"

lvh.me 트릭은 localhost에 매핑됩니다. 그것은 굉장. 참조 하위 도메인에 대한이 Railscast메모 추가 정보를 원하시면 있습니다.

바라건대 그렇게해야합니다. 나는 교차 하위 도메인 사이트가 일반적이라고 생각하기 때문에 프로세스가 왜 이렇게 복잡한 지 완전히 확신하지 못합니다. 이러한 각 단계의 이유에 대해 더 많은 통찰력이있는 사람이 있으면 의견을 통해 알려주십시오.


여러 최상위 도메인에서이 작업을 수행하는 방법이 있습니까? 다른 국가에서 실행되는 제품이 있습니다. 여기서 우리는 기본 도메인이 yourdomain.com이라고 가정하고 있지만 .be .sv .fr .com.br .com.ar 등에서 작동한다면 어떻게 될까요? 감사.
Marc Lainez 2013 년

이 작업을 수행 할 수 없습니다. 저는 레일 4에서 개발 중이며 rials가 위의 모든 코드를 부드럽게 무시하는 것처럼 보입니다. 하위 도메인간에 세션을 공유하고 싶지 않습니다.
Ole Henrik Skogstrøm

@ OleHenrikSkogstrøm config.secret_key_base모든 응용 프로그램 에서 동일하게 사용하십시오. 그렇지 않으면 쿠키를 디코딩 할 수 없습니다.
Bruno Buccolo 2014 년

17

쿠키를 루트 도메인으로 설정하는 가장 간단한 방법을 찾는 동안 이것을 발견했습니다. :all도메인 옵션으로 전달되었을 때 옵션 에 대한 잘못된 정보가있는 것 같습니다 . 예상대로 대부분의 도메인의 경우, 실제로 (예를 들어 루트 도메인에 쿠키를 설정, 작동 .example.com에 대한 test.example.com). 대부분의 사람들은 도메인 lvh.me을 사용하여 테스트하기 때문에 문제를 경험했다고 생각합니다 . 레일에서 최상위 도메인을 찾기 위해 사용하는 정규식은로 정의됩니다 DOMAIN_REGEXP = /[^.]*\.([^.]*|..\...|...\...)$/. 마지막 부분을 살펴보면 rails lvh.me가와 유사한 TLD로 해석된다는 것을 알 수 있습니다 com.au. 사용 사례가 lvh.me작동 해야하는 경우 :all옵션이 제대로 작동하지 않지만 대부분의 도메인에서 가장 간단하고 최상의 옵션 인 것으로 보입니다.

TL; DR, 여기서 정답은 3 글자 도메인 (또는 위의 정규식을 혼동하는 도메인)에서 개발하지 않는다고 가정 할 때 :all.


감사합니다. 이것은 마침내 왜 그렇게 많은 답변이 tld_length 2를 권장하는지 이해하는 데 도움이되었지만 왜 그럴 필요가 없었는지 이해했습니다!
soupdog

이 답변은 더 높아야합니다. 감사합니다.
luca.busin

"lvh.me를 com.au와 유사한 TLD로 사용"BTW Rails는 실제로 .me를 국가 도메인 (몬테네그로)과 동일한 방식으로 해석해야합니다.
mahemoff

7

Rails 4.x (Rails 5/6 버전에서도 괜찮음)

localhost에서 lvh.me:3000 및 하위 도메인을 가져 오는 방법 (레일)

개발 :에 추가하기 위해 쿠키를 공유 .lvh.me했습니다 session_store.rb.

localhost admin.lvh.me:3000등의 하위 도메인간에 공유 lvh.me:3000됩니다.

#config/initializers/session_store.rb

domain = Rails.env.production? ? ".domain_name.com" : ".lvh.me"

Rails.application.config.session_store :cookie_store, 
                      key: '_app_name_session', domain: domain

4

시도해 보았 니

AppName::Application.config.session_store :cookie_store, key: '_application_devise_session', domain: 'lvh.me'  

)

기본적으로 우리는 기본 도메인에 대해 단일 쿠키가 있고 하위 도메인을 무시한다고 말합니다.이 접근 방식에는 여전히 몇 가지 결함이 있지만 ...


2

지원 레일 5

원하는 경우 모든 도메인에서 작동합니다.

Rails.application.config.session_store :cookie_store, key: '_my_app_session', domain: :all, tld_length: 2

환경별로 구성하려면 다음을 사용할 수 있습니다.

Rails.application.config.session_store :cookie_store, key: '_my_app_session', domain: {
  production: '.example.com',
  development: '.example.dev'
}.fetch(Rails.env.to_sym, :all)

참고 : https://github.com/plataformatec/devise/wiki/How-To:-Use-subdomains


0

세션 저장소에 Redis를 사용하는 경우.

if Rails.env.development?
    Rails.application.config.session_store :redis_store, {
       servers: [
        { host: 'localhost', port: 6379},
      ],
      key: '_app_session',
      expire_after: 1.day,
      domain: :all
    }

else
    Rails.application.config.session_store :redis_store, {
       servers: [
        { host: HOST_URL, port: PORT},
      ],
      key: '_app_session',
      expire_after: 1.day,
      domain: '.domain.com',
      tld_length: 2
    }
    
end 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.