미들웨어 생성
아래 명령어를 실행하면 app/http/Middleware/ 경로에 ForceSSL.php 파일이 생성됩니다.
php artisan make:middleware ForceSSL
생성된 파일을 열어서 handle 함수에 http를 https로 redirect하는 코드를 작성하시면 됩니다.
저 같은 경우에는 APP_ENV 변수가 prod나 production일 경우에만 http 체크를 하도록 했지만 모든 환경에서 적용하기를 원하시면 해당 조건을 제거하시기 바랍니다.
namespace App\Http\Middleware; use Closure; class ForceSSL { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { if (!$request->secure() && (env('APP_ENV') === 'prod' || env('APP_ENV') === 'production')) { return redirect()->secure($request->getRequestUri()); } return $next($request); } }
커널 등록
생성한 미들웨어를 커널에 등록해주어야 사용할 수 있습니다.
app/Http/Kernel.php 파일을 열어서 $routeMiddleware 배열에 위에서 생성한 미들웨어를 추가합니다.
namespace App\Http; use Illuminate\Foundation\Http\Kernel as HttpKernel; class Kernel extends HttpKernel { ...생략 protected $routeMiddleware = [ ...생략 'forcessl' => \App\Http\Middleware\ForceSSL::class ]; }
사용하기
모든 페이지에서 SSL을 사용해도 상관없지만 보통 로그인 페이지나 패스워드가 포함되어 있는 페이지에서 사용하겠죠?
로그인 페이지에 등록하기
로그아웃 같은 경우에는 예외 처리 하지 않으면 http 페이지에서 로그아웃 할 때 에러가 발생합니다.
namespace App\Http\Controllers\Auth; use Illuminate\Http\Request; use App\Http\Controllers\Controller; use Illuminate\Foundation\Auth\AuthenticatesUsers; use GuzzleHttp\Client; class LoginController extends Controller { ...생략 public function __construct() { ...생략 $this->middleware('forcessl', ['except' => 'logout']); } ...생략
라우터에서 사용하기
...생략 Route::get('admin/profile', function () { // })->middleware('forcessl'); ...생략