평범한 이야기들

[TIL] PHP Laravel - 사용자 인증과 인가 본문

평범한 개발 이야기/Laravel

[TIL] PHP Laravel - 사용자 인증과 인가

songsariya 2021. 3. 2. 18:17
728x90

라라벨6.0 이전에는 인증 스캐폴딩이 별도의 패키지로 분리되지 않고 프레임워크에 통합되어 있었음

  • 인증(Authentication) : 시스템에서 누구인지 확인하고 시스템 내에서 그 사람이 활동하게 허용하는 것 (로그인/ 로그아웃)
  • 인가(Authorization) : 인증된 사용자에게 특정 행동을 허용할지 말지 결정하는 것 (관리자 시스템)

User 마이그레이션과 User모델 그리고 Illuminate\Foundation\Auth\User 를 보면 라라벨에서 제공해주는 내용이 들어가 있음

 

Auth() 글로벌 헬퍼와 Auth 퍼사드

auth() 글로벌 헬퍼를 사용하면 애플리케이션 어디서든 현재 인증된 사용자의 상태를 쉽게 다룰 수 있음

Auth 퍼사드를 이용해도 동일함

auth()->check(); // 로그인 했는지 확인 (boolean : 로그인 상태 true)
auth()->guest(); // 로그인 했는지 확인 (boolean : 비로그인 상태 true)

 

인증 스캐폴드

인증 스캐폴드 기능은 새 어플리케이션에서 실행하도록 고안된 것으로, 빠르게 인증 시스템에 적용하도록 스켈레톤 코드를 제공

라라벨 6부터 인증 스캐폴딩 기능이 별도의 패키지로 분리되어 필요한 경우에만 추가로 설치하여 사용

인증 스캐폴드는 laravel/jetstream 패키지를 사용하여 라이브와이어와 이너셔 두 가지 스택 중 하나를 골라서 사용할 수 있음

  • 라이브와이어 : 라라벨 블레이드를 템플릿 언어로 사용, 자바스크립트 대신 라이브와이어를 사용해 프런트엔트 인터렉션을 처리
  • 이너셔 : Vue를 템플릿 언어로 사용, Vue 라우터 대신 라라벨 라우터를 사용하게 하는 라이브러리

사용방법

~ composer require laravel/jetstream && php artisan jetstream:install {스택명}

// 또는

~ laravel new Sample --jet
~ cd Sample

// .env 파일 수정
~ php artisan migrate
npm install && npm run dev

인증 스캐폴드를 이용해 간단하게 사용자 인증과 관련된 내용을 확인할 수 있음

 

따로 다루지 않고 소스 파악

 

remember me 로 사용자 로그인 유지

//사용자 인증 시도
if( auth()->attempt([
    'email' => request()->input('email'),
    'password' => request()->input('password'),
])) {
    // 로그인 성공 처리
}

해당 코드를 사용해 로그인을 처리하면 세션이 유지되는 동안만 로그인이 유지

쿠키를 사용해서 로그인 유지 기간을 무기한으로 늘리고 싶으면 auth()→attempt() 메서드의 두 번째 파라미터에 boolean 값 true를 전달하면 됨

//사용자 인증 시도
if( auth()->attempt([
    'email' => request()->input('email'),
    'password' => request()->input('password'),
], request()->filled('remember') )) {
    // 로그인 성공 처리
}

사용자가 remember 토큰으로 인증한 것인지 여부를 수동으로 확인해야 할 필요가 있으면 auth()→viaRemember() 메서드를 이용 (boolean 값 리턴)

 

비밀번호 재확인

사용자의 특정 행동 전에 비밀번호를 한 번 더 확인하는 게 필요할 때

라우트에 password.confirm 미들웨어를 적용해서 확인 가능함 (확인 후 3시간 저장됨 시간 관련은 config/auth.php 설정 파일에서 password_timeout 설정 변경)

 

수동으로 인증하기

운영자에서 사용자로 강제로 전환하는 경우 사용

4가지 메서드 제공을 함

// 1. 명시적으로 사용자 ID 넘기는 방법
auth()->loginUsingId(5);

// 2. 유저 객체(혹은 Illumicate\Contracts\Auth\Authenticatable 컨트랙트를 구현한 객체)를 전달하는 방법
auth()->login($user);

// 3.4. 세션이나 쿠키에 영향을 주지 않고 현재 요청에서만 인증을시키는 방법
auth()->once(['username' => 'mmmm']);
또는
auth()->onceUsingId(5);

once() 메서드에 넘기는 배열에는 인증시키고자 하는 사용자를 식별하는 모든 키/값 쌍이 들어갈 수 있음

 

수동으로 로그아웃하기

auth()->logout();

현제 세션뿐만 아니라 다른 기기에서도 로그아웃되게 하려면 logoutOtherDevices() 메서드를 이용

해당 기능을 사용하기 위해서는 AuthenticateSession 미들웨어를 app\Http\Kernel.php에 있는 web 그룹에서 주석 해제를 해야 함

auth()->logoutOtherDevices($password); // 사용자의 패스워드가 필요로 함

라우트 별로 로그인 여부에 따른 접근을 제한할 수 있는 라우트 미들웨어를 제공해 손쉽게 적용 가능함

Route::middleware('auth')->group(function() {
    Route::get('account', 'AccountController@dashboard');
});

Route::get('login', 'Auth\LoginController@getLogin')->middleware('guest');

 

블레이드 인증 지시어

@auth
    // 인증된 사용자
@endauth 

@guest
    //  인증되지 않은 사용자
@endguest

// 가드명을 파라미터로 넘겨서 사용할 가드를 지정할 수 있음

@auth('trainees')
    // 인증된 사용자
@endauth 

@guest('trainees')
    //  인증되지 않은 사용자
@endguest

 

가드

가드는 드라이버와 프로바이더 조합으로 이루어짐

  • 드라이버 는 인증 상태를 어떻게 저장하고 조회할 것인가 정의
  • 프로바이더 는 어떤 기준으로 사용자 정보를 가져오는지 정의

라라벨은 기본적으로 web, api 2개의 가드를 제공

  • web 가드는 세션 드라이버와 기본 사용자 프로바이더를 사용하는 전통적 인증 방식
  • api 가드는 토큰 트라이버와 기본 사용자 프로바이더를 사용
728x90
Comments