在Rails中将session信息保存到redis的方法(安装redis服务器)

以下是有关Redis的说明,Redis是经常被用作持久性键值存储(KVS)的。这篇文章主要介绍在开发环境中的配置。

Redis可以通过键值对关系存储数据,广泛应用于会话管理和Sidekiq中的电子邮件持久化等各种场景。

会话(Session)和Cookie的不同之处

会话……识别由同一用户发起的多个请求的方法之一
Cookie……实现会话的手段之一

通常情况下,HTTP通信被认为是无状态的,每次通信都是独立的。但是,这样的话,如果已经登录的用户需要进行通信,每次都需要进行确认,这样就会变得非常麻烦。因此,我们使用了一种叫做”Cookie”的方法,来实现通过相同登录用户的请求来识别会话。

将保存会话信息的位置设置为redis的原因是什么

    • サーバ複数台構成になってロードバランサで処理分散した場合にセッション情報を使い回せるように

 

    • デフォルトのクッキーストアはセキュリティ的に脆い

 

    →厳密のいうと、デフォルトのクッキーストアでも暗号化されてブラウザに保存されるのでなりすましなどのリスクが高いわけではないが。

安装Redis

为了在Mac上安装Redis,可以使用brew。

请安装Redis:运行命令$ brew install redis。

使用Redis作为Rails的session存储库。

宝石的引入

在使用Rails时,常常使用redis-rails来使用Redis。
只需在Gemfile中写入redis-rails并执行bundle install。

gem 'redis-rails'

$ bundle install --path vendor/bundle

会话保存设置(这是关键之处)

首先,Rails默认情况下在config/initializers/session_store.rb中写有会话设置。我们首先需要将这个默认设置注释掉。

如果要设置开发环境的话,之后


config.session_store :redis_store, servers: 'redis://localhost:6379', expire_after: 1.day

写在上面。

启动Redis服务器。

$ redis-server
75400:C 10 Feb 2020 00:20:51.337 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
75400:C 10 Feb 2020 00:20:51.338 # Redis version=5.0.7, bits=64, commit=00000000, modified=0, pid=75400, just started
75400:C 10 Feb 2020 00:20:51.338 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 5.0.7 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 75400
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

75400:M 10 Feb 2020 00:20:51.344 # Server initialized
75400:M 10 Feb 2020 00:20:51.345 * DB loaded from disk: 0.000 seconds
75400:M 10 Feb 2020 00:20:51.345 * Ready to accept connections


如果您已经安装了redis-server,在不启动redis-server的情况下访问localhost:3000,会出现连接被拒绝的错误-对127.0.0.1:6379进行连接(2),请注意!

Redis的内容

当你查看Redis内部时,你可以看到存储在cookie中的session_id。session_id存储在key为session_id的散列格式中进行保存和管理。

首先,使用$ redis-cli连接到Redis,并使用keys *命令查看存储在Redis中的键的列表。

$ redis-cli
127.0.0.1:6379> keys *
 1) "queues"
 2) "stat:processed:2020-01-30"
 3) "stat:processed:2020-01-25"
 4) "stat:failed"
 5) "2::bd503b1718ff6d40ebbea425f65118e00b74f5c7da051dd70e1d942662f9dbc5"
 6) "queue:mailers"
 7) "stat:processed"
 8) "stat:failed:2020-01-30"
 9) "2::c0928f6f585c2e9a4138aa1c1fe40679eaa33ca884c7fd4661ac49f8e9901892"
10) "stat:failed:2020-01-25"

比如说,(9)中的”2::c0928f6f585c2e9a4138aa1c1fe40679eaa33ca884c7fd4661ac49f8e9901892″是可确认的密钥(会话ID)。

另外,当您输入命令 “get 2::c0928f6f585c2e9a4138aa1c1fe40679eaa33ca884c7fd4661ac49f8e9901892” 时,您可以查看与该键(会话ID)相关联的值(例如会话信息)。

127.0.0.1:6379> get 2::c0928f6f585c2e9a4138aa1c1fe40679eaa33ca884c7fd4661ac49f8e9901892
"\x04\b{\tI\"\x0fsession_id\x06:\x06ETo:\x1dRack::Session::SessionId\x06:\x0f@public_idI\"E8fa23d9c40882684d78f6c3ecdf6ac0475d1c67b16a5021c9bcac5fa56a1d677\x06;\x00FI\"\tcsrf\x06;\x00FI\"1qRYmNiN9C6xDHE4hXu2OVvM/Rer+W/WhmV3h/koEngc=\x06;\x00FI\"\rtracking\x06;\x00F{\x06I\"\x14HTTP_USER_AGENT\x06;\x00TI\"-2bc71067222d9672fb261f3a4ace789ebf9606d2\x06;\x00FI\"\x10_csrf_token\x06;\x00FI\"1TRhm5z6eTQnTewVT7Ro5fElJ7ROm9hPlixwOdjB/ApY=\x06;\x00F"

这个被转成二进制的看起来很难看,但是仔细看可以确认到_csrf_token之类的东西。

    • Railsのデフォルトであるクッキーストアでの管理方式だと、この_csrf_tokenなどの保存場所がクッキーになります。

 

    • クッキーのバリューを復号化することでと_csrf_tokenやuser_idなどが取得できます。

 

    redisストアでの管理方式だと、この_csrf_tokenなどの保存場所がredisになります。キーとバリューのハッシュ形式で保存されています!

可以通过浏览器的开发者工具轻松查看cookie。

Image from Gyazo

当您查看“应用程序”选项卡下的“Cookies”项目时,您可以看到当前在浏览器中保存的Cookies的列表。

在不使用redis的情况下,默认情况下,Rails会将Session信息加密并将其设置为_runteq_normal_session键的值,就像这个图像中表达的那样。

一旦将管理方式切换到Redis,就可以一目了然地看到对于”_session_id”键,会被设置为会话ID作为值。

然而,实际上存储在浏览器中的cookie信息中的值和redis保存的会话ID(键)是不匹配的,但从源码来看,它们指的是相同的东西。
这里的理解是,在redis生成会话ID并将其作为值放入cookie中传递给浏览器时,会使用与会话信息相关联的随机数字来转换会话ID并传递给cookie,所以它们不匹配是可以理解的。

此外,根据设置,该会话ID也可以在指定的时间段内在redis服务器端进行重置。因此,只要正确配置,即使窃取了浏览器的cookie信息,通过重置就可以阻止非法访问。

广告
将在 10 秒后关闭
bannerAds