스택큐힙리스트

인가와 인증 차이 본문

개발

인가와 인증 차이

스택큐힙리스트 2025. 7. 19. 12:26
반응형

인증(Authentication)은 ‘누구냐’를 묻고, 인가(Authorization)는 ‘무엇을 할 수 있느냐’를 답한다.
이 문장 하나로 두 개념의 핵심을 잡으면, Spring Security 설계 · 디버깅이 훨씬 쉬워집니다. 오늘은 이 두 축을 깔끔히 구분해 보고, 실제 애플리케이션에서 어떻게 흘러가는지도 살펴봅니다.


1. 개념 먼저 정리하기

  • 인증: 사용자가 실제로 주장한 신원이 맞는지 증명하는 과정입니다. 로그인, OAuth2 소셜 콜백, API Key 검증 등이 여기 포함됩니다.
  • 인가: 이미 인증된 사용자에게 요청 자원에 대한 접근 권한을 부여·거부하는 과정입니다. “관리자만 /admin 접속 가능”, “게시글 작성자는 수정·삭제 가능” 같은 룰이 여기에 해당합니다.

2. 실생활 비유로 감 잡기

  • 인증 = 신분증 검사: 건물 로비에서 사원증을 보여 주면 “아, 사내 직원이군요”라고 확인.
  • 인가 = 출입 권한 확인: 이후 서버실 통과하려면 사원증의 ‘서버실 접근’ 권한이 있어야 문이 열립니다.

3. Spring Security 흐름 속 위치

  1. 인증 필터
    • UsernamePasswordAuthenticationFilter, BearerTokenAuthenticationFilter 등이 요청 헤더·폼 데이터를 확인해 Authentication 객체를 만듭니다.
  2. 인가 필터
    • FilterSecurityInterceptor가 컨트롤러 진입 직전에 AccessDecisionManager를 호출해 ROLE, 권한 어노테이션(@PreAuthorize 등)을 검사합니다.

둘은 순차적이며 서로 의존하지만, 역할은 분리 되어 있습니다. 인증이 성공해야만 인가 단계로 넘어갈 수 있습니다.

4. 왜 구분이 중요한가?

  • 버그 위치를 빠르게 좁힌다
    • 401 Unauthorized → 인증 단계 실패.
    • 403 Forbidden → 인증은 성공했지만 권한 부족(인가 실패).
  • 보안 정책을 모듈화
    • 같은 인증 방식을 쓰더라도, 프로젝트별 인가 규칙(RBAC·ABAC)은 달라집니다. 모듈 분리가 유지보수에 필수입니다.
  • 테스트 전략이 달라진다
    • 인증은 Mock 사용자·Token 생성으로 단위 테스트, 인가는 @WithMockUser·@WithUserDetails로 통합 테스트를 작성합니다.

5. 흔히 하는 실수 & 해결 팁

 

실수 증상 해결 실마리
인증과 인가 로직을 한 필터에 섞음 코드가 비대·테스트 어려움 단일 책임 원칙 지키기
모든 유저에게 ROLE_USER만 부여 세분화된 권한 관리 불가 역할·자원 매트릭스를 문서화
401과 403 응답을 혼동 클라이언트 오류 처리 꼬임 ExceptionTranslationFilter 커스터마이징
 

: 개발 중엔 `spring.security.filter.debug=true` 로 DebugFilter를 켠 뒤, “인증→인가” 로그 흐름을 눈으로 확인하면 훈련이 빨라집니다.

6. 한눈에 보는 체크리스트

  • ☐ 인증 성공 후 SecurityContextHolder 에 Authentication 저장되는지
  • ☐ 인가 애너테이션(@PreAuthorize 등) 이 정상 적용되는지
  • ☐ 401/403 로그가 어떤 필터·Voter에서 발생했는지
  • ☐ 토큰·세션 탈취 대비 HTTPS, SameSite, HttpOnly 설정이 있는지
반응형
Comments