PHP 프레임워크 – CodeIgniter – 6 – 사용자 인증과 권한 관리

PHP 프레임워크 - CodeIgniter - 6 - 사용자 인증과 권한 관리
PHP 프레임워크 – CodeIgniter – 6 – 사용자 인증과 권한 관리

PHP 프레임워크 – CodeIgniter – 사용자 인증과 권한 관리

안녕하세요~ 😄
이번 시간에는 웹 애플리케이션 개발에서 절대 빠질 수 없는 기능!
바로 **사용자 인증(Authentication)**과 **권한 관리(Authorization)**에 대해 알아보겠습니다.

로그인, 로그아웃, 회원가입, 관리자와 일반 유저의 권한 구분 등
“누가”, “어떤 기능에 접근할 수 있는가”를 제어하는 시스템은
모든 웹 서비스의 기초 체력이자 보안의 핵심이에요!

지금부터 차근차근 함께 살펴보면서 여러분만의 인증 시스템을 만들어볼게요 💪


1. 사용자 인증이란?

사용자 인증이란 누가 로그인했는지 확인하고
해당 사용자만 사용할 수 있는 기능을 제공하는 과정을 말해요.

비유하자면,

“우리 집 초인종을 누르고 본인 인증 후 문을 열어주는 과정”
바로 그게 사용자 인증이에요! 😊


2. CodeIgniter에서 인증 구현 방법

CodeIgniter에는 인증 전용 라이브러리가 기본 포함되어 있지는 않지만,
직접 구현하거나 외부 라이브러리(예: Myth\Auth)를 연동해서 사용하면 돼요.

이번 글에서는 직접 구현하는 방식을 기준으로 설명드릴게요!


3. 기본 사용자 테이블 설계 예시

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(100) NOT NULL UNIQUE,
    email VARCHAR(100) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    role VARCHAR(20) DEFAULT 'user',
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
  • username, email : 사용자 식별용
  • password : 해시된 비밀번호
  • role : 관리자/일반 사용자 구분

4. 회원가입 컨트롤러

// app/Controllers/Auth.php
namespace App\Controllers;
use App\Models\UserModel;

class Auth extends BaseController
{
    public function register()
    {
        return view('auth/register');
    }

    public function registerSubmit()
    {
        $rules = [
            'username' => 'required|is_unique[users.username]',
            'email' => 'required|valid_email|is_unique[users.email]',
            'password' => 'required|min_length[6]',
        ];

        if (!$this->validate($rules)) {
            return view('auth/register', ['validation' => $this->validator]);
        }

        $model = new UserModel();
        $model->save([
            'username' => $this->request->getPost('username'),
            'email' => $this->request->getPost('email'),
            'password' => password_hash($this->request->getPost('password'), PASSWORD_DEFAULT),
        ]);

        return redirect()->to('/login')->with('message', '회원가입이 완료되었습니다!');
    }
}

🔐 비밀번호는 반드시 password_hash()로 암호화해서 저장하세요!


5. 로그인 컨트롤러

public function login()
{
    return view('auth/login');
}

public function loginSubmit()
{
    $model = new UserModel();
    $user = $model->where('username', $this->request->getPost('username'))->first();

    if (!$user || !password_verify($this->request->getPost('password'), $user['password'])) {
        return redirect()->back()->with('error', '아이디 또는 비밀번호가 올바르지 않습니다.');
    }

    // 세션 저장
    session()->set([
        'user_id' => $user['id'],
        'username' => $user['username'],
        'role' => $user['role'],
        'isLoggedIn' => true
    ]);

    return redirect()->to('/dashboard');
}

6. 로그아웃 처리

public function logout()
{
    session()->destroy();
    return redirect()->to('/login')->with('message', '로그아웃 되었습니다.');
}

7. 로그인 상태 확인하기 (필터 활용)

CodeIgniter에서는 **필터(Filter)**를 사용해서
특정 경로에 로그인 여부나 권한을 확인할 수 있어요.

필터 생성

php spark make:filter AuthFilter
// app/Filters/AuthFilter.php
namespace App\Filters;

use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use CodeIgniter\Filters\FilterInterface;

class AuthFilter implements FilterInterface
{
    public function before(RequestInterface $request, $arguments = null)
    {
        if (!session()->get('isLoggedIn')) {
            return redirect()->to('/login');
        }
    }

    public function after(RequestInterface $request, ResponseInterface $response, $arguments = null) {}
}

8. 필터 등록 및 적용

// app/Config/Filters.php
public $aliases = [
    'auth' => \App\Filters\AuthFilter::class,
];

public $globals = [
    'before' => [],
    'after' => [],
];

public $filters = [
    'auth' => ['before' => ['dashboard', 'admin/*']],
];

이제 /dashboard, /admin/... 경로에 접근하려면 로그인되어 있어야 합니다!


9. 관리자 권한 확인 (컨트롤러에서)

if (session()->get('role') !== 'admin') {
    return redirect()->to('/')->with('error', '접근 권한이 없습니다.');
}

10. 로그인한 사용자 정보 뷰에 출력하기

<p>안녕하세요, <?= esc(session()->get('username')) ?>님!</p>
<a href="/logout">로그아웃</a>

11. 로그인 상태에 따른 메뉴 변경

<?php if (session()->get('isLoggedIn')): ?>
    <a href="/dashboard">내 계정</a>
<?php else: ?>
    <a href="/login">로그인</a>
<?php endif; ?>

12. Myth\Auth 라이브러리 (참고용)

CodeIgniter 4 공식 인증 라이브러리인 Myth\Auth를 설치하면 아래 기능을 자동 지원해요:

  • 회원가입
  • 로그인 / 로그아웃
  • 이메일 인증
  • 비밀번호 초기화
  • 사용자 그룹과 권한 시스템

설치:

composer require myth/auth
php spark auth:install
php spark migrate

주의할 점 ✅

항목 주의할 내용
비밀번호 저장 반드시 password_hash()로 암호화해야 함
세션 보안 사용자 정보는 최소한으로, 민감 정보 저장 금지
관리자 권한 관리자만 접근 가능한 URL은 항상 권한 체크 필수
필터 설정 특정 URL만 필터 적용하는 것이 좋음
로그인 유효성 DB에 사용자 존재 여부 + password_verify() 함께 검사

마무리하며 😊

사용자 인증과 권한 관리는 여러분의 웹 애플리케이션을
더 안전하게, 더 스마트하게 만들어주는 핵심 기능이에요.

CodeIgniter를 통해 손쉽게 로그인, 회원가입, 로그아웃, 권한 제어까지
전부 구현할 수 있으니, 꼭 한 번 실습해보시길 추천드려요!

다음 시간에는 REST API 개발에 대해 알아보겠습니다.
그럼 오늘도 즐거운 코딩 되세요~! 😎🧑‍💻✨

답글 남기기