17강 - 라라벨에 내장된 사용자 인증

16강에 이어 이번 강좌에서는 라라벨에 딸려서 배포(Shipping)되는 인증 기능을 살펴 보자. 내장된 사용자 인증 기능은 특정 시간내에 로그인 실패가 많으면 로그인을 제한하는 쓰로틀링 기능이 포함되어 있고, 좀 더 나이스하게 코드를 구조화해 놓았다. 핵심은 16강과 동일하다.

Controllers

app/Http/Controllers/Auth 디렉토리를 보면 2개의 파일이 보인다.

  • AuthController.php - 새 사용자 등록과 로그인/로그아웃 로직을 포함하고 있다.
  • PasswordController.php - 패스워드 리셋 로직을 포함하고 있다. (이 강좌에서는 다루지 않는다.)

Routes

app/Http/routes.php 를 열어 아래 내용을 추가 하자.

Route::get('/', function() {
    return 'See you soon~';
});

Route::get('home', [
    'middleware' => 'auth',
    function() {
        return 'Welcome back, ' . Auth::user()->name;
    }
]);

// Authentication routes...
Route::get('auth/login', 'Auth\AuthController@getLogin');
Route::post('auth/login', 'Auth\AuthController@postLogin');
Route::get('auth/logout', 'Auth\AuthController@getLogout');

// Registration routes...
Route::get('auth/register', 'Auth\AuthController@getRegister');
Route::post('auth/register', 'Auth\AuthController@postRegister');

참고 AuthController를 눈 씻고 찾아 봐도, getLogin() 메소드를 찾을 수 없다. 이들 메소드는 Illuminate\Foundation\Auth\AuthenticateUsers 트레이트 에서 찾을 수 있다.

Views

뷰는 라라벨에 기본 포함되어 있지 않다. 공식 문서를 참조해서 뷰를 만들자.

로그인 폼 - resources/views/auth/login.blade.php

@extends('master')

@section('content')
  <form method="POST" action="/auth/login">
    {!! csrf_field() !!}

    <div>
      Email
      <input type="email" name="email" value="{{ old('email') }}">
    </div>

    <div>
      Password
      <input type="password" name="password" id="password">
    </div>

    <div>
      <input type="checkbox" name="remember"> Remember Me
    </div>

    <div>
      <button type="submit">Login</button>
    </div>
  </form>
@stop

사용자 등록 폼 - resources/views/auth/register.blade.php

@extends('master')

@section('content')
  <form method="POST" action="/auth/register">
    {!! csrf_field() !!}

    <div>
      Name
      <input type="text" name="name" value="{{ old('name') }}">
    </div>

    <div>
      Email
      <input type="email" name="email" value="{{ old('email') }}">
    </div>

    <div>
      Password
      <input type="password" name="password">
    </div>

    <div>
      Confirm Password
      <input type="password" name="password_confirmation">
    </div>

    <div>
      <button type="submit">Register</button>
    </div>
  </form>
@stop

실험해 보자.

서버를 부트업하고, 'auth/register' 와 'auth/login' Route를 방문해 보자. 사용자를 등록하고, 로그인/로그아웃('auth/logout') 해보자.

참고 라라벨에서 기본 제공하는 인증에서 패스워드는 최소 6자리 이상이어야 한다. App\Http\Controllers\Auth\AuthController@validator 메소드를 보면 'password' => 'required|confirmed|min:6' 라고 유효성 검사 규칙이 지정되어 있는 것을 확인할 수 있다. 유효성 검사, 뷰에 쓰인 old() 함수에 대해서는 뒤에서 다시 살펴보도록 하자.

참고 다음으로 넘어가기 전에 로그인 뷰에서 소스보기를 해 보자. <input type="hidden" name="_token" value="jPR...nO2"> 란 라인을 볼 수 있다. 바로 csrf_field() Helper Function이 CSRF 공격을 막기 위해 만든 토큰을 담은 숨은 입력 폼이다. 13강에서 공부한 내용이다. {!! !!}은 '<', '>' 같은 특수문자의 '<', '>' Escaping 되는 것을 막기 위한 블레이드의 Interpolation 문법이다.




comments powered by Disqus
목록 토글
keyboard_arrow_up