Laravel 인증 jwt-auth에 로그인 실패시 잠금 기능을 추가하고 보안을 강화하는 방법

jwt-auth에 잠금 기능을 추가하여 보안을 강화하세요.



최근에는 프런트 엔드와 백엔드를 느슨하게 결합하는 것이 현대적인 구현이므로,
프런트엔드는 vue,nuxt등의 SPA를 사용해, Laravel을 API서버로서 사용하는 패턴이 많은 것은 아닐까요.

nuxt와 vue에서 Laravel에 로그인 할 때 API 인증 (로그인 기능)으로 자주 사용되는 것이 jwt-auth입니다.
htps : // 기주 b. 이 m / ty 몬데시 g s / jwt - 아 th

JWT 인증을 Laravel에 도입하는 순서에 대해서는, 여러가지 기사가 있습니다만,
보안을 강화하기 위해 jwt-auth의 표준에서는 탑재되어 있지 않은 인증에 여러 번 실패했을 때의 락 아웃 기능을 추가했습니다.

jwt-auth 도입



Laravel에 대한 API 인증 구현과 jwt-auth의 도입에 대해서는 이 기사를 이해하기 쉽습니다.
API로 로그인하여 bearer 토큰을 반환하고 프런트 엔드 SPA 등에서 이용할 때 사용합니다.

htps : // 코 m/자부로/있어 ms/176f907 에아 46767283785
htps : // 코 m / 노 자키 - 산코 sc / ms / 7 d320d6549f5f92b9b9

Bearer 인증 정보



laravel 표준 로그인에는 잠금 기능이 있지만 ...



laravel의 표준 로그인 기능에는 실패했을 때 잠그는 기능이 표준 탑재되어 있습니다. 멋지네요.


laravel/app/Http/Controllers/Auth/LoginController.php
    protected $maxAttempts = 2;     // ログイン試行回数(回)
    protected $decayMinutes = 10;   // ログインロックタイム(分)

이런 식으로 2개의 변수를 추가하는 것만으로 락아웃 기능을 유효하게 해 주는 나이스인 기능입니다만, 유감스럽게도 jwt-auth를 사용하고 있는 경우, 이 변수를 추가하는 것만으로는 물론 사용할 수 없습니다.

jwt-auth에서도 잠금 기능을 사용하는 방법



이 기사와 같이 API 로그인하여 token을 반환하는 기능을 구현한 경우 login() 메서드는 다음과 같습니다.
//id,pwで認証してtokenを発行
    function login(){

        $credentials = request(['email', 'password']);

        //もし認証エラーなら
        if(!$token = auth('api')->attempt($credentials)){
            return response()->json(['error' => 'Unauthorized'], 401);
        }

        //OKならtoken発行
        return $this->respondWithToken($token);
    }

이 방법을 다음과 같이 수정했습니다.
    use AuthenticatesUsers;
    protected $maxAttempts = 3;
    protected $decayMinutes = 1;

    public function login(Request $request)
    {
        $credentials = $request->input(['email', 'password']);

        // ログイン失敗回数をチェックして、制限を超えている場合はロックアウト
        if ($this->hasTooManyLoginAttempts($request)) {
            $this->fireLockoutEvent($request);
            return $this->sendLockoutResponse($request);
        }

        // ログインに失敗した場合のみ、試行回数を増やす
        // 成功した場合はカウントしない。
        if (!$token = auth('api')->attempt($credentials)) {
            $this->incrementLoginAttempts($request);
            return response()->json(['error' => 'Unauthorized'], 401);
        }

        // ログインに成功した場合は、制限をクリアする(お好みで)
        $this->clearLoginAttempts($request);
        $result = $this->respondWithToken($token);
        return $result;
    }

이 설정을 사용하면 로그인에 세 번 실패하면 1분 동안 잠금이 걸리고 429 Too Many Requests 응답이 반환됩니다.
락아웃 제한중에는 올바른 로그인 정보를 보내 와도 로그인은 통하지 않습니다.

sendLockoutResponse($request) 에는, 「앞으로 몇 초에 사용할 수 있게 될거야」라는 정보가 들어가 있습니다만,
게다가 보안을 높이는 것이라면 단순히 abort(429) 를 돌려주면 좋을 것입니다.
 if ($this->hasTooManyLoginAttempts($request)) {
            $this->fireLockoutEvent($request);
            abort(429);
        }

실패의 임계치등은 env 파일에 써 관리하는 편이 좋을지도 모르겠네요.
도움이되면 LGTM 버튼을 부탁드립니다

좋은 웹페이지 즐겨찾기