반응형
오늘은 Spring Security를 사용해 웹 애플리케이션에 인증(Authentication)과 권한(Authorization)을 구현하는 기본적인 방법을 학습합니다. Spring Security는 보안 설정과 관리에 강력한 기능을 제공합니다.
1. Spring Security란?
Spring Security는 Spring 애플리케이션의 보안 프레임워크로 다음과 같은 기능을 제공합니다:
- 인증(Authentication): 사용자의 신원을 확인합니다.
- 권한(Authorization): 사용자에게 허용된 리소스만 접근 가능하게 합니다.
- 보안 필터: 다양한 보안 기능(예: CSRF, 세션 관리)을 제공합니다.
2. 프로젝트에 Spring Security 추가하기
(1) 의존성 추가
Maven을 사용하는 경우, pom.xml에 Spring Security 의존성을 추가합니다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
Gradle 사용 시:
implementation 'org.springframework.boot:spring-boot-starter-security'
3. 기본 보안 설정
Spring Security를 추가하면 기본적으로 모든 엔드포인트가 보호되고, /login 페이지가 기본 제공됩니다.
사용자 이름: user
비밀번호: 애플리케이션 실행 시 로그에 표시됨.
로그인 페이지 실행 로그 예시:
Using generated security password: a12b34cd-56ef-78gh-90ij
4. 사용자 정의 보안 설정
Spring Security의 기본 설정을 커스터마이즈하여, 원하는 인증 및 권한 관리를 구현할 수 있습니다.
(1) Security Configuration 클래스 작성
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/admin/**").hasRole("ADMIN")
.requestMatchers("/user/**").hasAnyRole("USER", "ADMIN")
.anyRequest().permitAll()
)
.formLogin(form -> form
.loginPage("/login")
.permitAll()
)
.logout(logout -> logout
.logoutUrl("/logout")
.permitAll()
);
return http.build();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
(2) In-Memory 사용자 정의
@Bean
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth
.inMemoryAuthentication()
.withUser("admin").password(passwordEncoder().encode("admin123")).roles("ADMIN")
.and()
.withUser("user").password(passwordEncoder().encode("user123")).roles("USER");
}
5. 로그인 및 권한 확인
(1) /login 페이지
Spring Security에서 제공하는 기본 로그인 페이지를 사용하거나 커스터마이즈할 수 있습니다.
(2) URL 접근 테스트
- /admin/**: 관리자 계정만 접근 가능 (ROLE_ADMIN)
- /user/**: 사용자와 관리자 모두 접근 가능 (ROLE_USER, ROLE_ADMIN)
- 기타 경로: 인증 없이 접근 가능.
6. 커스텀 로그인 페이지 만들기
(1) Thymeleaf를 사용한 로그인 페이지 작성
src/main/resources/templates/login.html:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Login</title>
</head>
<body>
<h2>로그인 페이지</h2>
<form th:action="@{/login}" method="post">
<div>
<label>Username:</label>
<input type="text" name="username" />
</div>
<div>
<label>Password:</label>
<input type="password" name="password" />
</div>
<button type="submit">Login</button>
</form>
</body>
</html>
7. 보안 테스트
- /admin에 접근 시 관리자 계정(admin123)으로 로그인.
- /user에 접근 시 사용자 계정(user123)으로 로그인.
- 인증되지 않은 사용자로 접근 시 /login 페이지로 리다이렉션.
8. 추가 구현
- Database 연동: 사용자 정보를 데이터베이스에 저장하고 인증 처리.
- OAuth2: Google, Facebook 같은 외부 인증 서비스 연동.
- JWT: 토큰 기반 인증.
반응형
'개발 > 전자정부프레임워크' 카테고리의 다른 글
Spring Security 커스터마이징 (Custom UserDetailsService 구현) (0) | 2024.12.30 |
---|---|
Spring Security와 데이터베이스 연동하기 (0) | 2024.12.30 |
RESTful API와 Spring Boot의 REST 컨트롤러 설계하기 (0) | 2024.12.30 |
Spring Boot에서 Pagination(페이징)과 Sorting(정렬) 구현하기 (0) | 2024.12.29 |
Spring Boot에서 트랜잭션 관리(Transaction Management) 설정하기 (0) | 2024.12.29 |