FuelPHP로 세션 공유 시 주의 사항

7328 단어 FuelPHPPHPelasticache

TL;DR



FuelPHP에서 세션 정보를 Memcache, RDBMS 등을 사용하여 여러 노드에서 공유하는 경우,
  • app/config/crypt.php

  • 여러 노드에서 동일한 값이되도록 설정해야합니다.

    배경



    웹 앱을 여러 노드로 구성하고 로드 밸런서에서 세션을 유지하지 않으려면 사용자가 노드를 다시 액세스하더라도 세션을 유지하기 위해 세션 저장소로 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,
                )
            ),
    );
    

    세션 스토어로서 다른 시스템을 사용하는 경우 등은 아래의 공식 문서를 참조하면 됩니다.
  • ht tp // // php lphp. jp/도 cs/1. HTML

  • 암호화 키 설정



    그래서 여기에서 중요하며, 이것만의 설정만으로는, 본질적으로는 세션의 공유를 할 수 없습니다.
    로드 밸런서가 다른 노드에 새 요청을 흔들 때마다 세션을 유지할 수 없다는 증상이 있습니다. (환경을 만드는 방법에 따라 다음 정보가 동일하므로 의도하지 않고 올바르게 작동하는 경우도 있습니다)

    이것은,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개가 필요해, 각각 이하의 조건을 만족할 필요가 있습니다. 그렇지 않으면, 다시 작성되어 버려 노드마다 다르게 되어 버립니다.
  • base64 디코드 가능한 캐릭터 라인
  • 문자열의 길이는 4의 배수

  • 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";
    

    참고


  • ht tp // 마 d로오 mp 로지ぇct. bgs포 t. jp / 2013/03 / 척 lphp ぢ s. HTML
  • htp // 9jp. 인후 / 아 r ゔ s / 12368
  • htp : //에서 v.ぁsss d. jp / c ぉ d / 아 ws / php 세시 온 - 에 s 치카치 ぇ /
  • h tp : // 쿠이타. 이 m / 슈퍼 타이 02 / ms / f3에 f9148fd5235 예 2816
  • 좋은 웹페이지 즐겨찾기