๋ผ๋ผ๋ฒจ ๋ฏธ๋ค์จ์ด๋ก ์ค์ ํ์ด์ง HTTPS๋ก ์ ๊ณตํ๊ธฐ
ย
์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ธ๋ผ์ฐ์ ์ ์๋ฒ๊ฐ์ ์ค๊ฐ๋ ์ ๋ณด๋ฅผ ์ํธํํ๊ณ ๋ณดํธํด์ผ ํ ๊ธฐ๋ฅ(๋ก๊ทธ์ธ, ๊ฒฐ์ ์ฒ๋ฆฌ๋ฑ)๋ฑ์ด ์์ ๊ฒฝ์ฐ SSL/HTTPS ๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ํ๊ฒ ์ ๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์์ต๋๋ค.
์ต๊ทผ์๋ ํ๋์จ์ด์ ์ฌ์์ด ์ถฉ๋ถํ๋ค๋ฉด ์ ์ฒด ์น ์ ํ๋ฆฌ์ผ์ด์ ์ HTTPS ๋ก ์ ๊ณตํ๋ ๊ฒฝ์ฐ๋ ๋ง์ด ์์ต๋๋ค.
ย
์ ์ฒด๋ฅผ HTTPS ๋ก ์ ๊ณตํ๋ ค๋ฉด ์น ์๋ฒ๋ SSL ๊ฐ์๊ธฐ๋ฑ์์ HTTP ๋ก ๋ค์ด์จ ์ฐ๊ฒฐ์ HTTPS ๋ก ์ ํํ๋๋ก ์ค์ ํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ ์์ด ์์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด nginx ์ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ด location ์ HTTP 301 Response์ ํจ๊ป HTTPS URL ์ ์ง์ ํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์์ ์์ด ๋ชจ๋ ํ์ด์ง๋ฅผ HTTPS ๋ก ์ ๊ณตํ ์ ์์ต๋๋ค.
server { listen 80; server_name myserver.com; location / { return 301 https://myserver.com$request_uri; } }
ย
๋ง์ฝ ์น ์๋ฒ์ ์ค์ ์ ์์ ํ ์ ์๊ฑฐ๋ HTTP ์ HTTPS ๋ฅผ ์์ด์ ์ ๊ณตํด์ผ ํ๋ค๋ฉด ๋ผ๋ผ๋ฒจ์ ๋ฏธ๋ค์จ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ ์ต์ํํ๋ฉด์ ์์ฝ๊ฒ HTTPS ๋ก ์๋น์ค๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
ย
๋ฏธ๋ค์จ์ด ์์ฑ
artisan ์ make ์ ํ์ ์ต์ ์ค์๋ ย ๋ฏธ๋ค์จ์ด๋ฅผ ์์ฑํ๋ ์ต์ ์ด ์์ผ๋ฉฐ ํ๋ผ๋ฏธํฐ๋ ๋ฏธ๋ค์จ์ด์ ์ด๋ฆ์ ๋๋ค. ๊ฐ์ ๋ก ย HTTPS ๋ก ์ ํํ๋ ์ญํ ์ ์ํํ๋ฏ๋ก ๋ฏธ๋ค์จ์ด์ ์ด๋ฆ์ ForceHttps ๋ก ๋ช ๋ช ํ์ฌ ์์ฑํฉ๋๋ค.
$ php artisan make:middleware ForceHttps
ย
๋ฏธ๋ค์จ์ด๋ย app\Http\Middleware\ ํด๋๋ด์ ๋ฏธ๋ค์จ์ด.php ํ์ผ๋ก ์์ฑ๋๋ฉฐ ์์์ ForceHttps ๋ฅผ ๋ฏธ๋ค์จ์ด ์ด๋ฆ์ผ๋ก ์ฃผ์์ผ๋ฏ๋กย app\Http\Middleware\ForceHttps.php ํ์ผ์ด ์์ฑ๋ฉ๋๋ค.
์ด์ ๋ฏธ๋ค์จ์ด ํ์ผ์ ์ด๊ณ ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋ฉํฉ๋๋ค.
<?php namespace App\Http\Middleware; use Closure; class ForceHttps { // HTTPS ๋ก ์ ๊ณตํ์ง ์์ URI. legacy ๋ก ์์๋๋ URI ์ผ ๊ฒฝ์ฐ SSL ์ ๊ฐ์ ์ ์ฉํ์ง ์์ protected $except = [ 'legacy/*', ]; // HTTPS ๋ก ์ ๊ณตํ์ง ์์ ์ ํ๋ฆฌ์ผ์ด์ ํ๊ฒฝ. ๊ฐ๋ฐ์ PC ์์ ๊ตฌ๋(local)ํ ๊ฒฝ์ฐ์ PHPUnit ์ ๊ตฌ๋(testing)ํ ๊ฒฝ์ฐ๋ ๊ฐ์ Https ๋ฅผ ์ฌ์ฉํ์ง ์์ protected $exceptEnv = [ 'local', 'testing', ]; /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { // Https ๊ฐ ์๋๊ณ ์ ์ธ๋๋ ์กฐ๊ฑด์ด ์๋ ๊ฒฝ์ฐ ๊ฐ์ ๋ก HTTPS ๋ก ํฌ์๋ฉ if (!$request->secure() && !$this->shouldPassThrough($request) && !$this->envPassThrough()) { return redirect()->secure($request->getRequestUri()); } return $next($request); } ย // ์ ์ธํ URI ์ธ์ง ํ์ธ protected function shouldPassThrough($request) { foreach ($this->except as $except) { if ($request->is($except)) { return true; } } return false; } ย // ์ ์ธํ ํ๊ฒฝ์ธ์ง ํ์ธ protected function envPassThrough() { $appEnv = \App::environment(); foreach ($this->exceptEnv as $except) { if ($appEnv === $except) return true; } return false; } }
ย
์ด์ ์์ฑํ ๋ฏธ๋ค์จ์ด๋ย app/Http/Kernel.php์ ๋ฑ๋กํ๋ฉด ๋๋ฉฐ ๋ผ๋ผ๋ฒจ์์๋ ๋ ๊ฐ์ง ๋ฐฉ์์ ๋ฏธ๋ค์จ์ด๊ฐ ์์ต๋๋ค.
ย
์ ์ญ ๋ฏธ๋ค์จ์ด(Global Middleware)
์ ์ญ ๋ฏธ๋ค์จ์ด๋ ๋ชจ๋ Request ๋ง๋ค ํธ์ถ๋๋ ๋ฏธ๋ค์จ์ด๋ก ํธ์ถ์ ์ค๋ฒํค๋๊ฐ ์์ง๋ง ๊ฐ๋ณ ๋ผ์ฐํธ์๋ ๋ฑ๋กํ์ง ์์๋ ๋๋ ์ฅ์ ์ด ์์ผ๋ฉฐ ๊ธฐ๋ณธ ํ์ฌ๋ ์ ์ญ ๋ฏธ๋ค์จ์ด๋ก๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ์ง๋ณด์ ์ํ์ธ์ง ํ์ธํ๋ย CheckForMaintenanceMode ์ Csrf ํ ํฐ์ ๊ฒ์ฆํ๋ย VerifyCsrfToken, ์ฟ ํค๋ฅผ ์ํธํํ๋ EncryptCookies ๋ฑ์ด ์์ต๋๋ค.
ย
๋ค์์ ForceHttps ๋ฏธ๋ค์จ์ด๋ฅผ ์ ์ญ ๋ฏธ๋ค์จ์ด๋ก ๋ฑ๋กํ๋ ์์ ์ ๋๋ค.
protected $middleware = [ \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class, \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \App\Http\Middleware\ForceHttps::class, // ๋ชจ๋ ์ปจํ ์ธ ์ ๋ํด Https ๋ก ์ ๊ณต ];
ย
๋ผ์ฐํธ ๋ฏธ๋ค์จ์ด(Route Middleware)
๋ผ์ฐํธ ๋ฏธ๋ค์จ์ด๋ก ๋ฑ๋กํ๋ ค๋ฉด ์๋์ ๊ฐ์ด $routeMiddleware ๋ฐฐ์ด์ ํค๋ก ๋ฏธ๋ค์จ์ด์ ๋ณ๋ช ์, ๊ฐ์๋ ๋ฏธ๋ค์จ์ด ํด๋์ค๋ฅผ ์ ์ด์ฃผ๋ฉด ๋ฉ๋๋ค.
๋ผ์ฐํธ ๋ฏธ๋ค์จ์ด๋ HTTP์ HTTPS ๋ฅผ ํผ์ฉํด์ ์ฌ์ฉํด์ผ ํ ๊ฒฝ์ฐ์ ๋ผ์ฐํธ ๋ณ๋ก https ์ฌ์ฉ ์ฌ๋ถ๋ฅผ ์ค์ ํ ์ ์์ผ๋ฏ๋ก ์ ์ฉํฉ๋๋ค.
protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'force.https' => \App\Http\Middleware\ForceHttps::class, ];
ย
ย
์ด์ ๋ผ์ฐํธ ์ค์ ์ ๋ค์๊ณผ ๊ฐ์ด middelware ๋ผ๋ ํค์ ๋ฏธ๋ค์จ์ด ์ด๋ฆ(force.https)๋ฅผ ์ฌ์ฉํ์ฌ https ์ฌ์ฉ ์ฌ๋ถ๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค.
//Route::get('auth/login', 'Auth\AuthController@getLogin'); // https ๋ฏธ๋ค์จ์ด ์ ์ฉ Route::get('auth/login',['middleware' => 'force.https', 'as' => 'auth.login', 'uses' => 'Auth\AuthController@getLogin']);
ย
๋ง์ฝ ์ฌ๋ฌ ๊ฐ์ ๋ฏธ๋ค์จ์ด๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ๋ฏธ๋ค์จ์ด ์ด๋ฆ์ ๋ฐฐ์ด๋ก ๋๊ฒจ์ฃผ๋ฉด ๋ฉ๋๋ค.
Route::get('admin/profile', ['middleware' => ['force.https', 'auth', ], function () { return view('profile.edit'); }]);
๋ผ์ฐํธ ๋ฏธ๋ค์จ์ด๋ก ๋ฑ๋กํ ๊ฒฝ์ฐ auth ๋ฏธ๋ค์จ์ด๋ณด๋ค force.https ๋ฅผ ๋จผ์ ์ ์ด ์ฃผ์ด์ ๋จผ์ ํธ์ถ๋๋๋ก ํด์ผ ํฉ๋๋ค. auth ๋ฅผ ๋จผ์ ์ ์ผ๋ฉด http ๋ก ์ธ์ฆ์ด ์ด๋ฃจ์ด์ง ํ์ https ๋ก ์ ํ์ด ๋๋ฏ๋ก ๋ก๊ทธ์ธ ์ ๋ณด ๋ณดํธ๊ฐ ์ ๋๋ก ๋์ง ์์ต๋๋ค.
ย
ย