on
[TIL] PHP Laravel - 사용자 인증과 인가
[TIL] PHP Laravel - 사용자 인증과 인가
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
from http://yoshikixdrum.tistory.com/248 by ccl(A) rewrite - 2021-03-02 18:26:54