← 전체 글로 돌아가기

웹 개발

권한 체크가 제대로 작동하지 않을 때

관리자 페이지의 권한 검증이 예상대로 작동하지 않을 때, 어디서 실패했는지 체계적으로 찾는 방법을 정리했다.

관리자 기능을 추가했는데, 권한 없는 사용자가 접근할 수 있다는 버그 보고가 들어왔다. 정말 긴장하는 순간이다.

처음엔 로그인한 사용자의 권한을 확인하는 로직을 봤는데, 알고 보니 여러 곳에서 권한을 체크하고 있었다. 프론트엔드, 백엔드, 미들웨어... 어디가 빠졌는지 알 수 없었다.

상황 정의

먼저 정확히 뭐가 문제인지 파악한다:

  • 버튼이 안 보임: 프론트엔드 숨김
  • 페이지 진입 안 됨: 라우팅 가드
  • 데이터는 안 나옴: 백엔드 권한 체크
  • API 요청이 거절됨: API 미들웨어 권한 체크

각각은 다른 원인이다. 사용자가 본 동작이 정확히 뭔지 기록해야 한다.

백엔드 권한 체크 확인

가장 중요한 건 백엔드다. 프론트엔드는 속일 수 있지만, 백엔드는 절대로 속으면 안 된다.

# API 직접 호출
curl -X GET https://api.example.com/admin/users \
  -H "Authorization: Bearer $TOKEN"

# 권한 없는 토큰으로도 시도
curl -X GET https://api.example.com/admin/users \
  -H "Authorization: Bearer $INVALID_TOKEN"

둘 다 같은 결과가 나온다면 백엔드 권한 체크가 작동하지 않는 거다. 반드시 403 또는 401이 나와야 한다.

토큰과 권한 정보 확인

사용자가 로그인했을 때 토큰에 실제로 권한 정보가 들어가 있는가?

# JWT 토큰 디코딩 (jwt.io 또는 cli)
jwt decode $TOKEN

token에 role: "admin" 같은 정보가 있는지, 만료 시간은 타당한지 확인한다.

프론트엔드 권한 체크

백엔드가 제대로 작동한다면, 프론트엔드는 그걸 믿고 사용자에게만 UI를 숨긴다. 프론트엔드 권한 체크는 단지 UX다. 실제 보안은 백엔드가 담당한다.

빌드 후 확인

npm run build
# 프로덕션 빌드에서는 권한 로직이 제대로 번들되는가?

Tree-shaking이나 최적화 때문에 권한 체크 코드가 제거되는 경우는 거의 없지만, 조건부 렌더링이 제대로 작동하는지는 확인해야 한다.

권한 종류별 테스트

각 권한 수준별로 따로 테스트한다:

  1. 권한 없는 사용자: 모든 관리자 기능에 접근 거절
  2. 일반 관리자: 자신의 데이터만 수정 가능
  3. 슈퍼 관리자: 모든 기능 사용 가능

각 경우를 따로 로그인해서 테스트한다. 특히 경계선(edge case)을 조심한다.

권한 캐싱 문제

사용자 권한을 캐싱하고 있다면, 권한이 변경됐을 때 캐시를 갱신하는가?

  • 로컬 스토리지의 사용자 정보 버전
  • 백엔드의 권한 정보 캐시 (Redis 등)
  • 토큰 만료 시간

마지막으로, 권한 문제는 "이상하다"는 느낌만으로는 위험하다. 정확히 curl 또는 Postman으로 API를 직접 호출해보고, 토큰을 디코딩해보고, 각 권한 수준별로 따로 테스트해야 한다. 그래야 실제로 보안 홀이 없는지 확신할 수 있다.