개발
인가와 인증 차이
스택큐힙리스트
2025. 7. 19. 12:26
반응형
“인증(Authentication)은 ‘누구냐’를 묻고, 인가(Authorization)는 ‘무엇을 할 수 있느냐’를 답한다.”
이 문장 하나로 두 개념의 핵심을 잡으면, Spring Security 설계 · 디버깅이 훨씬 쉬워집니다. 오늘은 이 두 축을 깔끔히 구분해 보고, 실제 애플리케이션에서 어떻게 흘러가는지도 살펴봅니다.
1. 개념 먼저 정리하기
- 인증: 사용자가 실제로 주장한 신원이 맞는지 증명하는 과정입니다. 로그인, OAuth2 소셜 콜백, API Key 검증 등이 여기 포함됩니다.
- 인가: 이미 인증된 사용자에게 요청 자원에 대한 접근 권한을 부여·거부하는 과정입니다. “관리자만 /admin 접속 가능”, “게시글 작성자는 수정·삭제 가능” 같은 룰이 여기에 해당합니다.
2. 실생활 비유로 감 잡기
- 인증 = 신분증 검사: 건물 로비에서 사원증을 보여 주면 “아, 사내 직원이군요”라고 확인.
- 인가 = 출입 권한 확인: 이후 서버실 통과하려면 사원증의 ‘서버실 접근’ 권한이 있어야 문이 열립니다.
3. Spring Security 흐름 속 위치
- 인증 필터
- UsernamePasswordAuthenticationFilter, BearerTokenAuthenticationFilter 등이 요청 헤더·폼 데이터를 확인해 Authentication 객체를 만듭니다.
- 인가 필터
- 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 설정이 있는지
반응형