ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring Boot: 세션 기반 로그인/회원가입 + 인터셉터 권한 제어(RBAC) 구현
    Side Project 2026. 1. 3. 20:38

    1. 목표(요구사항)

    • 로그인/회원가입 기능 구현
    • 인증 방식: HttpSession 기반(Session-based Authentication)
    • 권한 방식: 역할 기반 인가(RBAC)
    • 역할(ROLE)
      • ROLE_ADMIN: 전체 기능 가능
      • ROLE_SALES: 프로젝트 관리(등록/수정/삭제) 가능
      • ROLE_SUPPORT: 기술지원(등록/수정/삭제) 가능
    • 비밀번호 저장: BCrypt 해시(password_hash)

    2. DB 설계(users)

    • users
      • user_id (PK)
      • login_id (UNIQUE 권장)
      • password_hash (BCrypt 해시 저장)
      • name
      • role (ROLE_ADMIN / ROLE_SALES / ROLE_SUPPORT)
      • created_at, updated_at, deleted_yn

    포인트

    • 평문 비밀번호 저장 금지 → 로그인 검증은 BCrypt.checkpw()로 처리

    3. 화면 구성(Thymeleaf)

    • /login : 로그인 화면
    • /join : 회원가입 화면
      • input: loginId, password, passwordConfirm, name, role
    • 헤더(공통)
      • 비로그인: 로그인/회원가입 노출
      • 로그인: 로그아웃 노출
      • (선택) role에 따라 버튼/메뉴 노출 분기

    4. 회원가입 흐름 (Controller → Service → DAO → SQL)

    4-1) JoinController

    • GET /join : 회원가입 화면 렌더링
    • POST /join : 회원가입 처리 요청

    4-2) JoinService 핵심 로직

    • 입력값 검증(아이디/비번/비번확인/이름)
    • 아이디 중복 체크
    • BCrypt.hashpw()로 비번 해시 생성
    • role 화이트리스트 검증(ROLE_*만 허용)
    • DB INSERT

    4-3) MyBatis Mapper

    • findByLoginId
    • insertUser

    5. 로그인 흐름 (세션 저장이 핵심)

    5-1) LoginController

    • GET /login : 로그인 화면
    • POST /login : 로그인 처리

    5-2) LoginService 핵심 로직

    • login_id로 사용자 조회
    • BCrypt.checkpw(입력비번, password_hash) 검증
    • 성공 시 세션에 LOGIN_USER 저장
      → 이후 인증의 기준이 됨

    6. 인터셉터 기반 인증/인가

    6-1) LoginInterceptor (인증)

    • 세션에 LOGIN_USER 없으면 /login으로 리다이렉트
    • 즉 “로그인 상태”의 판단 기준은 LOGIN_USER 존재 여부

    6-2) RoleActionInterceptor (인가/RBAC)

    • GET(조회)은 통과
    • POST(등록/수정/삭제)는 role 체크
      • ADMIN: 전부 통과
      • SALES: /support/project/** POST만 통과
      • SUPPORT: /support/support/** POST만 통과
    • 권한 없으면 alert로 안내 후 이전 페이지로 이동(또는 forbidden 페이지)

    7. 테스트 시나리오

    • ADMIN 로그인
      • 공지/프로젝트/기술지원 등록/수정/삭제 모두 가능
    • SALES 로그인
      • 프로젝트 등록/수정/삭제 가능
      • 기술지원 등록/삭제 시 “권한 없음” 처리
    • SUPPORT 로그인
      • 기술지원 등록/수정/삭제 가능
      • 프로젝트 등록/삭제 시 “권한 없음” 처리

    8. 트러블슈팅(짧게)

    • Required parameter 'role' is not present
      → HTML name="role"과 컨트롤러 파라미터명이 불일치(roles → role)였음
      → name/RequestParam 통일로 해결

    9. 마무리(다음 개선 포인트)

    • 회원가입에서 role 선택 제거(운영용): 기본 ROLE_SUPPORT로 가입
    • 관리자 페이지에서 role 변경 기능 추가
    • 버튼/메뉴를 role에 따라 숨김 처리(UX 개선)
    • 예외 처리(403/404) 공통화

     

Designed by Tistory.