질문을 삭제하지 말아주세요.!
 
1
0
-1

일정 시간이 지나면 자동으로 로그아웃되는 세션 타임아웃을 어떻게 설정해야 하는지 모르겠습니다.

config/session.php 에서 lifetime 항목을 조정하거나,

php.ini 관련 항목을 설정해줘도 자동적으로 로그아웃이 안 되더라구요 ㅠㅠ


그래서 로그인할 때 세션시작 시간을 정하고, 요청할 때마다 미들웨어에서 로그아웃하도록 하고 있습니다.

동작은 제대로 합니다만, 편법인 것 같아서 제대로된 방법을 알고싶습니다.


어떻게 하면 됩니까?

AuthController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class AuthController extends Controller
{   
	...
	public function login(Request $request, \GuzzleHttp\Client $client)
	{
		...
		$request->session()->put('started', time());
	}
}
SessionTimeout.php
<?php

namespace App\Http\Middleware;

use Illuminate\Support\Facades\Auth;
use GuzzleHttp\Client;

use Closure;

class SessionTimeout
{
    protected $client;

    public function __construct(Client $client)
    {
        $this->client = $client;
    }

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ($request->session()->get('started')) {
            /** 30초 **/
            if((time() - $request->session()->get('started') - 30) > 0) {
                Auth::guard('web')->logout();
                $this->client->request('GET', "/v1/auth/logout" ,[
                    'headers' => [
                        'Authorization' => 'Bearer '. $request->session()->get('token')
                    ]
                ]);
                $request->session()->remove('token');
            }
        }
        return $next($request);
    }
}
    CommentAdd your comment...

    1 answer

    1.  
      1
      0
      -1

      config('session.lifetime') 동안 아무런 액션이 없으면 세션이 지워집니다. 아래와 같이 실험해 보시겠어요.

      • config('session.lifetime') 을 1로 설정한다.
      • 로그인하고, 아무런 액션없이 1분뒤에 로그인이 필요한 페이지를 조회하거나, 세션 값을 덤프해본다.
      • 로그인하고, 1분이 지날 때까지 로그인이 필요한 페이지를 리프레시하면서 세션이 유지되는 지 확인한다.
      1. 정만수

        앗.. 일단 그 방법은 여러차례 시도를 해 보았습니다.

        vagrant 랑 같이 사용하는데 가상머신하고 프로젝트에 둘 다 혹시 몰라서


        php artisan cache:clear
        php artisan config:clear


        캐쉬 삭제 구문도 돌려보고 해봤는데도 여전히 로그인세션이 유지되더라구요..

        유저로 로그인 한다 → 그 상태로 몇 분간 놔둔다 → 리프레쉬 해본다.


        이 과정을 반복해봤는데도 여전해서.. 결국 미들웨어로 만들어서 쓰는건데 왜 안되는지 이유를 모르겠어요 ㅠㅠ

      2. 김주원

        1. 로그인 직후 / lifetime 설정 시간 이후로 아래 덤프 값을 비교해 보셨나요?

        • config('session.lifetime') 덤프
        • 세션 전체 덤프

        2. 라라벨 프로젝트를 새로 하나 만들어서, 인증을 위한 최소의 코드만 짜서 config('session.lifetime')의 작동 여부를 확인. 여전히 안되면, PHP 세션 관련 매뉴얼을 읽고 PHP 설정 쪽을 디버깅해야 할 것 같아요.


        그리고, 세션의 기본 저장소는 파일 시스템이기때문에, 로드밸런서 뒤에 애플리케이션이 있다면 애플리케이션간 세션은 공유되지 않습니다. 이때는 세션을 공유할 수 있는 드라이버(redis 등)로 바꿔야 합니다.

      3. 김주원

        그리고, 로그인 후 Set-Cookie 응답 헤더에 달린 만료 시간도 관찰하면 좋겠습니다.

      4. 정만수

        WOW 답변 감사드립니다. 그 부분은 아직 안 해봤습니다. 그것도 한 번 실험해봐야 되겠군요.

      CommentAdd your comment...