Laravel로 서명된 URL

6356 단어 laravel
프로젝트에서 사용자가 어떤 식으로든 URL을 변경하지 않았는지 확인해야 하는 일부 코드를 수행하는 고유한 URL을 생성해야 할 수 있습니다. 예를 들어 사용자의 뉴스레터 구독을 취소하거나 사용자가 비밀번호 없이 가입할 수 있는 링크를 생성하는 경우 이메일 구독자에게만 할인을 제공할 수도 있습니다.

사용 사례가 무엇이든 라라벨은 서명된 URL로 작업할 수 있는 기능을 제공합니다.

서명된 URL 생성



서명된 URL을 생성하려면 먼저 명명된 경로를 만들어야 합니다. 예를 들어 사용자가 링크를 클릭하면 구독을 취소하는 명명된 경로를 만들겠습니다.

// routes/web.php
Route::get('/unsubscribe/{user}', [SubscriptionsController::class, 'unsubscribe'])
       ->name('unsubscribe');


이제 서명된 URL을 생성하기 위해 URL 파사드를 사용할 수 있습니다.

use Illuminate\Support\Facades\URL;

return URL::signedRoute('unsubscribe', ['user' => 1]);

signedRoute 메소드의 첫 번째 매개변수는 경로의 이름입니다. 여기서는 unsubscribed를 사용하고 있습니다. 위의 경로에 지정한 이름이고 두 번째 매개변수는 경로에 전달하려는 경로 매개변수(이 경우에는 사용자 ID)이기 때문입니다. 이 메서드는 다음과 같은 URL을 반환합니다.
https://yoursite.com/unsubscribe/1?signature=7594beb1a7af889d997eedc50f68eadb8b2e8d4097ba3a9ff1c600ffa8a02e49
보시다시피 Laravel은 해시와 함께 URL에 signature 매개변수를 첨부했습니다. 이는 URL을 나타내므로 사용자가 해당 URL의 일부를 수정하면 해시가 유효하지 않게 됩니다.

임시로 서명된 URL



일정 시간이 지나면 만료되는 URL을 만들 수도 있습니다. temporarySignedRoute 메서드를 사용하여 이러한 유형의 URL을 만들 수도 있습니다.

return URL::temporarySignedRoute(
    'unsubscribe', now()->addMinutes(30), ['user' => 1]
);


이 메소드의 두 번째 매개변수는 URL이 만료되는 시간입니다. 이 메소드를 사용하면 expires 매개변수가 URL에 추가되고 Laravel은 이 URL을 유효하지 않은 것으로 보고합니다.

URL 확인



이제 서명된 URL을 만들었지만 지금까지는 해시를 확인하지 않습니다. 이를 위해 라우트에 내장된 미들웨어signed를 사용할 수 있습니다. 이렇게 하려면 경로 선언에 미들웨어를 추가하기만 하면 됩니다.

// routes/web.php
Route::get('/unsubscribe/{user}', [SubscriptionsController::class, 'unsubscribe'])
       ->name('unsubscribe')
       ->middleware('signed');


이 미들웨어를 추가하면 Laravel은 자동으로 해시를 확인하고 403 HTTP 코드를 발생시킵니다.

오류 페이지 개인화.



URL이 유효하지 않을 때 사용자에게 표시되는 오류를 사용자 정의할 수도 있습니다. 이는 InvalidSignatureException에 대한 사용자 지정 렌더링 가능한 클로저를 정의하여 달성할 수 있습니다.

// app\Exceptions\Handler.php
use Illuminate\Routing\Exceptions\InvalidSignatureException;

/**
 * Register the exception handling callbacks for the application.
 *
 * @return void
 */
public function register()
{
    $this->renderable(function (InvalidSignatureException $e) {
        return response()->view('error.link-expired', [], 403);
    });
}


이 클로저 내에서 유효하지 않은 단일 URL을 방문할 때 사용자에게 표시되는 내용을 정의할 수 있습니다.

미들웨어 없이 URL 확인



경우에 따라 컨트롤러에서 URL을 확인해야 할 수 있습니다. 경로 정의에서 singed 미들웨어를 제거하고 대신 요청에서 hasValidSignature를 사용하여 이를 수행할 수 있습니다.

public function unsubscribe(Request $request)
{
    if (!$request->hasValidSignature()) {
        abort(401);
    }

    //...
}


이를 통해 사용자 지정 경험이 필요한 경우 조금 더 유연하게 사용할 수 있습니다.

좋은 웹페이지 즐겨찾기