목차
Spring security의 동작 방식

Spring security의 인증

Spring security 인가

필터에서 예외처리
필터내부에서 예외를 던졌을 때, @ControllerAdvice가 처리하지 못하고 500에러만 응답하는 이유에 대해서 알아보겠습니다.목차발생한 문제원인 분석처음 시도한 방법해결 방법발생한 문제Jwt 필터에
ung9776.tistory.com
필터에선 별도의 예외처리 전략이 필요합니다.
스프링 시큐리티 메서드 단위 인가 적용하기
Spring Security에서 보안 처리의 핵심은 인증(Authentication)과 인가(Authorization)입니다.
- 인증(Authentication): 사용자가 누구인지 확인하는 과정
- 인가(Authorization): 인증된 사용자가 특정 자원이나 메서드에 접근할 권한이 있는지 검증하는 과정
스프링 시큐리티는 주로 URL 단위로 인가를 설정하지만, 메서드 단위로 세밀한 접근 제어를 할 수도 있습니다.
메서드 단위 인가의 필요성
- 컨트롤러의 특정 메서드만 관리자(Admin) 권한으로 제한할 때
- 같은 URL이라도 요청 방식(GET, POST)에 따라 다른 권한이 필요할 때
메서드 단위 인가 적용 방법
1. 메서드 보안 활성화
먼저 스프링 시큐리티에서 메서드 단위 보안을 사용하려면 설정 클래스를 다음과 같이 추가합니다.
@Configuration
@EnableWebSecurity
@EnableMethodSecurity(securedEnabled = true, jsr250Enabled = true, prePostEnabled = true)
public class SecurityConfig {
// 기존 설정 유지
}
2. 메서드에 어노테이션 추가하기
다음 세 가지 어노테이션을 사용할 수 있습니다:
- @PreAuthorize: 메서드 실행 전 인가 확인
- @PostAuthorize: 메서드 실행 후 인가 확인
- @Secured: 메서드 실행 전에 특정 권한(역할)을 확인
예시 코드

@RestController
@RequestMapping("/api")
public class UserController {
@GetMapping("/users")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public List<UserDto> getAllUsers() {
// 관리자만 모든 사용자 정보를 조회할 수 있음
}
@GetMapping("/profile")
@Secured({"ROLE_USER", "ROLE_ADMIN"})
public UserDto getUserProfile(Authentication authentication) {
// 사용자 본인의 프로필을 조회
}
@PostMapping("/posts")
@PreAuthorize("hasAnyRole('ROLE_USER', 'ROLE_ADMIN')")
public PostDto createPost(@RequestBody PostDto postDto) {
// 유저 및 관리자 모두 게시물을 작성할 수 있음
}
}
3. 메서드 보안 어노테이션 설명
- @PreAuthorize("hasRole('ROLE_ADMIN')")
- 메서드가 실행되기 전 사용자 역할을 검사합니다. 조건을 만족하지 않으면 접근이 차단됩니다.
- @Secured("ROLE_USER")
- 권한을 간단히 설정할 때 주로 사용합니다. 조건 표현식이 필요하지 않을 때 유용합니다.
4. 권한 표현식 예시
표현식 설명
| hasRole('ROLE_USER') | 특정 역할만 접근 가능 |
| hasAnyRole('ROLE_USER', 'ROLE_ADMIN') | 여러 역할 중 하나라도 있으면 접근 가능 |
| hasAuthority('WRITE_PRIVILEGE') | 특정 권한만 접근 가능 |
| hasAnyAuthority('READ_PRIVILEGE', 'WRITE_PRIVILEGE') | 여러 권한 중 하나라도 있으면 접근 가능 |
| isAuthenticated() | 인증된 사용자만 접근 가능 |
| permitAll() | 누구나 접근 가능 |
5. 예외처리
// 스프링 시큐리티 인가(Access Denied) 예외처리
@ExceptionHandler(AccessDeniedException.class)
public ResponseEntity<ApiResponse<Void>> handleAccessDenied(AccessDeniedException e) {
log.error("Exception occurred: ", e); // 전체 스택 트레이스 로그 출력
return ResponseEntity.status(ErrorCode.ACCESS_DENIED.getStatus()).body(ApiResponse.failure(ErrorCode.ACCESS_DENIED.getMsg()));
}'프레임워크 > Spring' 카테고리의 다른 글
| Spring Boot에서 AOP와 Interceptor를 활용한 로깅 방법 (0) | 2025.06.12 |
|---|---|
| 테스트코드 알아보기 (0) | 2025.06.12 |
| 필터에서 예외처리 (0) | 2025.06.12 |