spring security스프링 시큐리티 쓰는 이유스프링 시큐리티 안쓰는 이유Spring Security란Spring Boot 개념

[Spring Boot Security] 인증과 권한 부여

KUKJIN LEE
KUKJIN LEE
2024년 12월 4일
220

Spring Boot Security는 웹 애플리케이션의 보안을 책임지는 강력한 도구로, 특히 인증(Authentication)과 권한 부여(Authorization)에 대한 확실한 구현이 가능합니다.

 

1. 인증 (Authentication)

1.1 인증의 개념은 사용자가 누구인지를 확인하는 과정입니다. Spring Security에서는 다양한 인증 메커니즘을 제공하며, 사용자 이름과 비밀번호, 소셜 로그인, API 키 등 여러 인증 수단을 쉽게 통합할 수 있습니다.

 

1.2 인증은 AuthenticationManager가 담당합니다. 일반적인 인증부터 특정 유형의 인증을 처리할 수 있도록 설계됩니다. 기본적으로 제공되는 DaoAuthenticationProvider를 사용하거나, 필요에 따라 커스텀 Provider를 구현할 수 있습니다.

 

1.3 인증 흐름 사용자가 로그인을 시도하면 Spring Security는 필터 체인을 통해 인증 요청을 처리합니다. 이 과정에서 입력된 자격 증명을 확인하고, 이후 유효성 검사를 진행합니다. 인증이 성공하면 사용자 정보를 저장하여 사용자에게 인증되었음을 알립니다.

 

2. 권한 부여 (Authorization)

2.1 권한 부여의 개념은 인증된 사용자가 특정 리소스에 접근할 수 있는지를 결정하는 과정입니다. Spring Security에서는 URL, 메서드, 도메인 객체에 대해 접근 제어를 설정할 수 있습니다.

 

2.2 @PreAuthorize@Secured를 사용한 권한 부여가 가장 많이 사용됩니다. @PreAuthorize는 메서드 실행 전에 접근 권한을 확인하며, 조건도 설정할 수 있습니다.

@PreAuthorize("hasRole('ADMIN')")
public void deleteUser(Long userId) {
    // 사용자 삭제 로직
}

ADMIN 권한을 가진 사용자만 deleteUser 메서드를 호출할 수 있도록 제한합니다.

 

2.3 URL 기반 권한 부여 설정 HttpSecurity를 사용해 URL에 대한 접근 권한을 설정할 수 있습니다. 관리자만 특정 URL에 접근하게 하는 코드를 예시로 확인해보겠습니다.

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
        .antMatchers("/admin/**").hasRole("ADMIN")
        .antMatchers("/user/**").hasAnyRole("USER", "ADMIN")
        .anyRequest().authenticated()
        .and()
        .formLogin();
}

/admin 패턴으로 시작하는 모든 요청은 ADMIN 권한을 가진 사용자만 접근할 수 있게하고, /user/**은 USER와 ADMIN 권한을 가진 사용자가 접근 가능하게 설정한 코드입니다.

 

2.4 권한 계층을 정의할 수 있습니다. 상위 권한이 하위 권한을 포함하도록 할 수 있습니다.

@Bean
public RoleHierarchy roleHierarchy() {
    RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
    roleHierarchy.setHierarchy("ROLE_ADMIN > ROLE_USER");
    return roleHierarchy;
}

관련 글

[SQL 입문] 필요한 데이터만 콕 집어 가져올 수 있는 WHERE 절

사용자는 테이블에 있는 모든 데이터를 다 보고 싶어 하지는 않습니다. 오히려 특정 항목에 대한 데이터만 가져오고 싶을 때가 훨씬 많습니다. 예를 들어, 어떤 사용자의 이메일이나 ID는 알고 있는데, 그 사람이 언제 우리 앱에 가입했는지 확인하고 싶다고 가정해 봅시다...

2026년 1월 27일10

SQL에서 SELECT란 무엇인가?

데이터베이스를 거대한 서류 보관함이라고 생각하면 됩니다. 보관함 안에는 수많은 데이터가 차곡차곡 쌓입니다. SELECT는 이 보관함에서 "내가 원하는 정보를 찾아줘!"라고 요청하는 명령어입니다. 이 과정을 전문 용어로 '쿼리(Query)'라고 부릅니다. &nbs...

2026년 1월 26일10

[SQL 기초] "언제 하나씩 다 넣어?" 데이터 한 번에 넣기

개발을 하다 보면 데이터베이스(DB)에 샘플 데이터를 대량으로 넣어야 할 때가 있습니다. 메뉴 100개를 추가해야 하는데 INSERT 문을 100번 쓰고 있다면? 너무 비효율적이죠! 오늘은 SQL에서 여러 데이터를 한 번에 넣는 '다중 삽입(Multiple Inse...

2026년 1월 21일13

SQL 데이터 삽입하기

데이터가 없는 데이터베이스는 연료 없는 로켓과 같습니다. 이제 'Missions' 테이블에 새로운 행(row)을 추가하는 방법을 알아보겠습니다. "삽입(Inserting)"은 '데이터 추가'를 의미합니다. 기존 Missions 테이블 ...

2026년 1월 20일12