FuelPHP로 세션 공유 시 주의 사항
7328 단어 FuelPHPPHPelasticache
TL;DR
FuelPHP에서 세션 정보를 Memcache, RDBMS 등을 사용하여 여러 노드에서 공유하는 경우,
여러 노드에서 동일한 값이되도록 설정해야합니다.
배경
웹 앱을 여러 노드로 구성하고 로드 밸런서에서 세션을 유지하지 않으려면 사용자가 노드를 다시 액세스하더라도 세션을 유지하기 위해 세션 저장소로 Memcache, RDBMS 등을 사용한다고 생각합니다. 합니다.
예를 들면, 다음과 같은 구성.
이러한 구성을 FuelPHP로 할 때의 주의점을 써 둡니다.
그림과 이후의 설명에서는 ElastiCache(Redis)를 사용하고 있습니다만, 주의점에 대해서는 RDBMS일 것이지만 보통의 Memcache일지도 같습니다.
세션 스토어 지정
FuelPHP는 먼저 세션 저장소를 app/config/session.php로 지정합니다. (덧붙여 환경에 따라 설정을 변경하고 싶은 경우는 config/staging/session.php 등에 기술하면 OK)
Redis를 사용한다면 session.php의 설명은 다음과 같습니다.
session.php<?php
return array(
'driver' => 'redis',
'redis' => array(
'cookie_name' => 'fuelrid',
'database' => 'default',
),
);
또한 Redis의 경우 db.php에 연결할 정보를 설명합니다.
db.php<?php
return array(
'redis' => array(
'default' => array(
'hostname' => 'xxxxxx.yyyyyy.nnnn.apne1.cache.amazonaws.com',
'port' => 6379,
'timeout' => null,
)
),
);
세션 스토어로서 다른 시스템을 사용하는 경우 등은 아래의 공식 문서를 참조하면 됩니다.
FuelPHP는 먼저 세션 저장소를 app/config/session.php로 지정합니다. (덧붙여 환경에 따라 설정을 변경하고 싶은 경우는 config/staging/session.php 등에 기술하면 OK)
Redis를 사용한다면 session.php의 설명은 다음과 같습니다.
session.php
<?php
return array(
'driver' => 'redis',
'redis' => array(
'cookie_name' => 'fuelrid',
'database' => 'default',
),
);
또한 Redis의 경우 db.php에 연결할 정보를 설명합니다.
db.php
<?php
return array(
'redis' => array(
'default' => array(
'hostname' => 'xxxxxx.yyyyyy.nnnn.apne1.cache.amazonaws.com',
'port' => 6379,
'timeout' => null,
)
),
);
세션 스토어로서 다른 시스템을 사용하는 경우 등은 아래의 공식 문서를 참조하면 됩니다.
암호화 키 설정
그래서 여기에서 중요하며, 이것만의 설정만으로는, 본질적으로는 세션의 공유를 할 수 없습니다.
로드 밸런서가 다른 노드에 새 요청을 흔들 때마다 세션을 유지할 수 없다는 증상이 있습니다. (환경을 만드는 방법에 따라 다음 정보가 동일하므로 의도하지 않고 올바르게 작동하는 경우도 있습니다)
이것은,FuelPHP 에서는 세션 ID 를 쿠키명으로 설정할 때 암호화를 실시하고 있습니다만, 이 때 사용하는 암호화 키가 노드 마다 다른 것이 원인입니다.
이 암호화 키는 기본적으로 설정되어 있지 않으며 필요할 때 처음으로 app/config/crypt.php에 자동으로 생성됩니다.
파일의 내용은 다음과 같습니다.
php.crypt.php<?php
return array(
'crypto_key' => '9eEBP8okkcz4xAo9rU5h4f7Q',
'crypto_iv' => 'HncqRUWjEl2Y53sqawnK4Y7Q',
'crypto_hmac' => 'ra4OxkVxYthofVMlAk0ncQrQ',
);
이 내용을 여러 노드에서 동일하게 합니다.
crypto_key, crypto_iv, crypto_hamc 의 3개가 필요해, 각각 이하의 조건을 만족할 필요가 있습니다. 그렇지 않으면, 다시 작성되어 버려 노드마다 다르게 되어 버립니다.
<?php
return array(
'crypto_key' => '9eEBP8okkcz4xAo9rU5h4f7Q',
'crypto_iv' => 'HncqRUWjEl2Y53sqawnK4Y7Q',
'crypto_hmac' => 'ra4OxkVxYthofVMlAk0ncQrQ',
);
core/classes/crypt.php 의 _init() 메소드를 보면 알 수 있다고 생각합니다.
거기에서 발췌하여 아래와 같은 코드로 암호화 키에 필요한 값을 생성할 수 있습니다.
<?php
function safe_b64encode($value)
{
$data = base64_encode($value);
$data = str_replace(array('+','/','='), array('-','_',''), $data);
return $data;
}
$crypto = '';
for ($i = 0; $i < 8; $i++)
{
$crypto .= safe_b64encode(pack('n', mt_rand(0, 0xFFFF)));
}
echo $crypto . "\n";
참고
Reference
이 문제에 관하여(FuelPHP로 세션 공유 시 주의 사항), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/takakiku/items/c6f508330070b06f8e81텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)