스프링 시큐리티(Spring Security) vs 전통적인 방식
by 볼빵빵오춘기과거 회원가입, 로그인 할 때에는 전통적인 방식을 구현했지만, 요즘은 Spring Security와 OAuth2.0을 사용한다.
전통적인 방식과 스프링 시큐리티가 무엇인지 알아보자!
전통적인 방식
회원가입
- 클라이언트에서 서버로 정보 전달
⇒ 사용자가 회원가입 폼에 정보를 입력하고 이를 서버로 전송한다. - 서버에서 데이터 처리 및 저장
⇒ 서버는 받은 정보를 데이터베이스에 저장한다.
이 때, 비밀번호는 암호화되지 않은 상태로 저장되는 경우가 많았다.
로그인
- 클라이언트에서 서버로 정보 전달
⇒ 사용자가 로그인 폼에 ID와 비밀번호를 입력하고 이를 서버로 전송한다. - 서버에서 인증
⇒ 서버는 데이터베이스에 저장된 사용자 정보와 입력된 정보를 비교하여 인증을 처리한다.
전통적인 방식의 주요 특징
- 평문 비밀번호 저장
사용자의 비밀번호를 암호화하지 않고 그대로 데이터베이스에 저장하는 경우가 많다. 이는 데이터베이스가 유출될 경우, 사용자의 비밀번호가 그대로 노출되는 심각한 보안 문제를 초래한다. - 세션 관리
- 사용자가 로그인에 성공하면 서버는 세션을 생성하고, 세션 ID를 쿠키에 저장하여 클라이언트에 전달한다.
이후 요청마다 클라이언트는 세션 ID를 서버에 보내어 인증을 받는다. - 세션 관리는 서버 메모리에 부담이 되고, 세션 탈취 등의 보안 이슈가 존재할 수 있다.
- 사용자가 로그인에 성공하면 서버는 세션을 생성하고, 세션 ID를 쿠키에 저장하여 클라이언트에 전달한다.
- 비효율적인 접근 제어
각 요청에 대해 접근 권한을 일일이 수작업으로 확인하는 방식이었다. 이로 인해 접근 제어 정책이 일관되지 않거나 누락되는 경우가 발생할 수 있다.
스프링 시큐리티(Spring Security)
- 스프링 기반의 애플리케이션에서 보안을 담당하는 강력한 프레임워크이다.
주로 웹 애플리케이션에서 인증(Authentication)과 권한 부여(Authorization)를 처리하는 데 사용한다. - Spring Security는 다양한 보안 기능을 제공하며, 대표적으로 인증, 권한 부여, 보안 설정, 기타 보안 기능, 커스터마이징 및 확장성 기능을 포함한다.
- Spring Security는 스프링 애플리케이션에서 보안에 대한 많은 부분을 처리해주므로, 개발자는 보다 안전하고 신뢰할 수 있는 애플리케이션을 구축할 수 있다.
기능
인증 (Authentication)
- 사용자가 누구인지 확인하는 과정이다.
- 주요 인증 방식으로는 폼 기반 인증, HTTP 기본 인증, HTTP Digest 인증, OAuth 등이 있다.
- 사용자 정보는 일반적으로 데이터베이스, LDAP, 인메모리 등의 저장소에서 관리된다.
- Spring Security는 사용자의 인증을 관리하기 위해 AuthenticationManager 인터페이스와 다양한 AuthenticationProvider 구현체들을 제공한다.
- 인증에 성공하면 인증된 사용자는 Principal 객체를 통해 접근할 수 있다.
권한 부여 (Authorization)
- 인증된 사용자가 특정 리소스 또는 기능에 접근할 수 있는 권한을 결정하는 과정이다.
- 보통 Access Control List (ACL)이나 권한 계층 구조(Role Hierarchy)를 사용하여 권한을 관리한다.
- @PreAuthorize, @Secured, @RolesAllowed 등의 애노테이션을 사용하여 메소드나 URL에 대한 접근 제어를 설정할 수 있다.
보안 설정 (Security Configuration)
- Spring Security는 보안 관련 설정을 위한 다양한 기능을 제공한다.
- Java 설정 클래스나 XML을 이용하여 필터 체인 설정을 통해 보안을 적용할 수 있다.
- CSRF(Cross-Site Request Forgery) 방어, 세션 관리, 로그인/로그아웃 처리 등의 기능을 제공한다.
기타 보안 기능
- 인증 실패 처리, 세션 관리, 동시 세션 제어, Remember-Me 기능(자동 로그인), 인증 이벤트 처리 등 다양한 보안 관련 기능을 지원한다.
- 다양한 인증 제공자(Provider)를 지원하여 LDAP, OAuth, OpenID 등 다양한 인증 방식을 연동할 수 있다.
커스터마이징 및 확장성
- Spring Security는 다양한 커스터마이징 기능을 제공하여 프로젝트의 특정 요구사항에 맞게 보안 정책을 세밀하게 조정할 수 있다.
- 필터 체인을 확장하거나 커스텀 필터를 추가하여 보안 로직을 세부적으로 제어할 수 있다.
기본 설정 예시
의존성 추가
pom.xml에 Spring Security 의존성을 추가한다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
보안 설정 클래스
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/main").permitAll() // '/','/main' 페이지는 누구나 접근 가능
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login") // 사용자 정의 로그인 페이지
.permitAll()
.and()
.logout()
.permitAll();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder(); // 비밀번호 암호화
}
}
- 루트 (/)와 홈 (/home) 페이지는 누구나 접근 가능하다.
- 그 외의 모든 요청은 인증이 필요하다.
- 사용자 정의 로그인 페이지 (/login)를 넘긴다.
- BCryptPasswordEncoder를 사용하여 비밀번호를 암호화하였다.
사용자 서비스 구현 예시
@Service
public class CustomUserDetailsService implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// 실제로는 DB에서 사용자 정보를 조회하여 반환
if ("user".equals(username)) {
return org.springframework.security.core.userdetails.User
.withUsername(username)
.password(new BCryptPasswordEncoder().encode("password"))
.roles("USER")
.build();
} else {
throw new UsernameNotFoundException("User not found");
}
}
}
정리하자면
- 인증과 권한 부여: 사용자의 신원을 확인하고, 특정 리소스에 대한 접근 권한을 제어한다.
- 구성 및 설정: XML이나 Java 클래스를 통해 보안 정책을 정의한다.
- 추가 보안 기능: CSRF 보호, 세션 관리, CORS 설정 등 다양한 보안 기능 제공한다.
✅ Spring Security는 매우 유연하고 강력하여 다양한 보안 요구 사항을 충족할 수 있다.
✅ 기본적인 설정부터 고급 설정까지, 다양한 방법으로 애플리케이션을 보호할 수 있다.
참고링크
https://www.elancer.co.kr/blog/view?seq=235
https://velog.io/@cyseok123/Spring-Security
내 정리 참고 링크
'👩🏻💻 About 프로그래밍 > Spring, Spring boot' 카테고리의 다른 글
권한 설정(feat. @PreAuthorize, @PostAuthorize) (0) | 2024.07.11 |
---|---|
스프링 시큐리티 SecurityConfig 설정(스프링부트 2.x.x vs 3.x.x) (0) | 2024.07.10 |
MVC1과 MVC2 비교 (0) | 2024.07.10 |
MVC (0) | 2024.07.08 |
DTO vs VO, DTO와 VO의 차이점, 언제 VO를 사용하고 언제 DTO를 사용하는가? (0) | 2024.07.08 |
블로그의 정보
Hello 춘기's world
볼빵빵오춘기