kkokkio - 프로젝트/트러블슈팅
SecurityConfig 엔드포인트 권한 설정
파란배개
2025. 6. 16. 09:30
문제 개요
오류 상황과 영향 범위 (예: 특정 코드 실행 시 발생, 특정 라이브러리 버전 호환 문제 등) 발생 배경 (예: 코드 테스트 중, 배포 중 문제 발견 등)
- 문제 배경
- 인증이 필요 없는 경로를 모두 공개함으로 보안 취약점 이슈 발생
- 엔드포인트 권한 설정에 대한 지식 부족
- 발생 배경
- 초기에는 “로그인, 회원가입”과 Swagger, H2 콘솔 같은 경로만 공개하고자 함.
- Role → USER, ADMIN, BlACK에 따라 권한 부여 필요
오류 메시지 및 원인 분석
오류 코드, 오류 메시지 포함 HTTP 상태 코드, 애플리케이션 로그, 서버 로그 등 구체적인 오류 정보 정리 및 로그 메시지를 통한 분석 제공 문제 발생 원인에 대한 심층 분석
- 오류 메세지
- 모든 API 요청이 인증 없이 통과
- 보통 로그에 별도 예외는 남지 않으나, 개발용 테스트 시 모든 엔드포인트가 permitAll()로 처리되어 인증 절차가 전혀 동작하지 않음
- 결과적으로 .anyRequest().hasAnyRole("USER","ADMIN") 까지 도달하지 못함
- 원인 분석
- 엔드포인트 설정에 대한 지식 부족으로 인해 잘못 설정을 진행함.
해결 및 고민 과정
처음 문제를 접했을 때 고려했던 대안들과 선택하지 않은 이유 실험적으로 적용한 방법이 실패한 사례와 그 이유 여러 해결책 중 최적의 방안을 선택한 과정
- 고민했던 대안들
- get, post http 기준으로 List<String>으로 엔드 포인트를 담아 permitAll() 설정을 좀 더 편리하게 진행하고자함
- 모든 엔드포인트를 전부 관리하고자 하였으나 너무 많은 엔드포인트를 입력해야하게 됨
- 따라서 반대로 권한이 필요한 엔드포인트만 관리하는 방식으로 변경
최종 해결책 및 구현
문제 해결을 위한 단계별 조치 방법과 코드 예시 (예: 특정 애노테이션 추가, 라이브러리 버전 조정, 설정 변경 등) 참고 자료 (관련 공식 문서, 개발자 커뮤니티 게시물 등)
결과 및 성능 분석
개선 후 응답 속도, DB 부하 감소 수치 등 구체적인 데이터 포함 문제 해결 전/후 성능 비교 그래프나 로그 분석 내용 포함 이슈 트래킹 및 자동화 방안 추가 (내부 개발자가 반복적인 문제 해결을 효율적으로 관리할 수 있도록 가이드 제공)
// 엔드포인트별 권한 설정
.authorizeHttpRequests(authorize ->
authorize
// 모든 HTTP 메소드에 대해 인증 없이 접근 가능한 경로
.requestMatchers(getPublicEndpoints().toArray(String[]::new)
).permitAll()
// 댓글 GET 요청 허용
.requestMatchers(HttpMethod.GET, "/api/v1/posts/*/comments")
.permitAll()
// 회원 권한
.requestMatchers(getPubliCUserEndpoints().toArray(String[]::new))
.hasRole("USER")
// 관리자 권한
.requestMatchers(getPublicAdminEndpoints().toArray(String[]::new))
.hasRole("ADMIN")
// 그 외 모든 요청 허용
.anyRequest().permitAll()
);
- 범용 공개→ GET 공개 → USER → ADMIN → 그 외 인증
- 해당 순서대로 요청 허용하도록 작성
추가 개선점
유사한 문제를 방지하기 위한 주의할 점 (예: 애노테이션 명시 여부, 프레임워크 업데이트 주기 확인 등) 문제 해결 과정에서 배운 점 및 중요한 교훈 공유 보안 고려 사항 추가 (해결 과정에서 발생할 수 있는 보안 리스크 및 예방 조치 포함)