일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- codeigniter
- FMS
- 옵지
- 업비트
- 프레임워크
- 라즈베리파이
- 회고
- 셀레니움
- 20.04
- 코드이그나이터
- 맥
- 옵G
- MySQL
- 맛집
- Laravel
- upbit
- php
- TiL
- 라즈비안
- 옵티머스g
- 라라벨
- 제주도
- ubuntu
- Selenium
- 우분투 20.04
- Raspberry Pi
- C
- Ubuntu 20.04
- 우분투
- 옵티머스 g
- Today
- Total
평범한 이야기들
[TIL] PHP Laravel - 사용자 인증과 인가 본문
라라벨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
가드는 토큰 트라이버와 기본 사용자 프로바이더를 사용