여러분들은 금융서비스에서 가장 중요한 부분이 무엇이라고 생각하시나요 ? 저는 단연 "보안"이라고 생각합니다 !
아무리 편리하고 좋은 서비스라도, 고객들의 개인 정보와 금융 거래 데이터를 안전하게 보호하지 못한다면 금융 기관의 역할을 제대로 해내지 못할 텐데요 !!
오늘은 Spring Security 의 핵심 개념에 대하여 작성해보겠습니다 출똥 🚗 !
💡컴퓨터 보안이란?

: 컴퓨터 시스템의 하드웨어, 소프트웨어 또는 데이터의 도난이나 손상, 컴퓨터가 제공하는 서비스의 중단 또는 오용으로부터 컴퓨터 시스템을 보호하는 것
- 기업 비즈니스를 저해하려는 사이버 공격자로 인하여 발생
- 주로 컴퓨터의 보안 취약점 CVE(Common Vulnerabilities and Exposures)을 공격함으로 컴퓨터 보안은 이러한 사이버 공격으로 부터 시스템을 보호하는 취지로 수행합니다 !
✔️ OWASP TOP 2024 ( 웹 관련 보안 취약점 상위 10개 알아보기)

OWASP(Open Web Application Security Project) 란 웹 애플리케이션 보안을 담당하는 비영리 단체로,
매년 웹 애플리케이션 보안 취약점을 발표합니다 !
빨간 색 부분은, 그 중에서도 인증과 관련된 보안 이슈를 표시해둔 건데 한번 읽어보시길 좋을 것 같습니다 ㅎㅎ !
- 작년과 달리 업데이트 된 인증 항목 중,
API2 Broken Authentication은 취약한 암호를 설정한 사용자를 해킹함으로, 인증 체계를 꾸준히 모니터링하고 사용자도 주기적으로 비밀번호를 변경할 필요성을 나타냅니다 !
API3: Broken Object Property Level Authorization 권한이 없는 사용자에게 리소스의 속성을 보게하거나 수정할 수 있게하여 생겨나는 취약점입니다. 개발자가 개발의 편의성을 위해, 개방적인 접근을 허용하게 된다면 안되겠죠 ?!
💡Spring Security란?
: 인증 및 접근 제어를 제공하는 프레임워크
- 일반적인 보안 공격에 대응할 수 있게 도와준다 !
- Spring 어플리케이션을 보호하기 위해 사용하는 사실상 표준(the de-facto)프레임워크이다.
“Spring Security is a powerful and highly customizable authentication and access-control framework”
✔️ Spring Seucity 주요 기능

✔️ 기본 로그인 화면 (Spring Security 제공)

Spring Security를 Maven이나 Gradle로 설정하면 기본적인 로그인 화면이 자동으로 생성됩니다. 이 로그인 화면은 실제 애플리케이션에서 사용하지 않는 것이 권장되지만, 여기서 제공되는 몇 가지 용어를 이해하는 것이 유용할 수 있습니다.
- Username (사용자 ID)
사용자의 고유 식별자를 의미합니다. Spring Security에서 제공하는 표현으로, 이 이름은 변경할 수 없습니다. - Password (비밀번호)
사용자의 비밀번호를 나타내며, 역시 Spring Security에서 고유하게 표현됩니다. 변경이 불가능합니다. - Role (권한)
사용자의 권한을 의미합니다. 문자열로 표현할 때는 ROLE_ADMIN, ROLE_USER와 같이 나타내며, 실제 사용 시에는 ADMIN과 같은 형태로 활용됩니다.
<intercept-url pattern = "/admin/**" access="hasRole('ADMIN')" />
<intercept-url pattern = "/**" access="hasRole('USER')" />
✔️ Crypto Module (암호화 모듈)

: Spring Security 내장된 암호화 모듈로 Hash의 경우 일반적인 Hash가 아닌 Solt 알고리즘 지원하는 안전한 Security Hash 알고리즘을 지원하며, 일반적인 암호화를 지원하기 위해 Encryptors 모듈을 지원하여 평문 암호화도 지원합니다.
✔️ Security Filter Chain

: 요청한 URL을 기반으로 보안 필터(Security Filter Chain)를 제공하며, 해당 필터를 통해 인가 된 사용자의 Role(역할)기반으로 페이지 간의 접근 할 수 있는 접근제어를 가능하게 만듭니다.
다음은 Security Filter Chain 작성법입니다 !
1. XML Security Configuration (Spring Security XML 구성)
<security:http>
<security:intercept-url pattern="/sample/all" access="permitAll"/>
<security:intercept-url pattern="/sample/member" access="hasRole('ROLE_MEMBER')"/>
<security:form-login />
</security:http>
<security:authentication-manager>
</security:authentication-manager>
XML 설정 방식은, Spring Security 초기부터 사용된 방식으로, 특정 URL 패턴 기반으로 권한을 설정합니다 !
/sample/all 경로는 모든 사용자에게 열려 있지만, /sample/member 경로는 "ROLE_MEMBER" 권한을 가진 사용자만 접근할 수 있게 제한합니다.
- 장점: 설정 파일이 별도로 존재해, 보안 관련 로직이 코드와 분리됩니다. 특히, XML 설정이 익숙한 개발자에게는 직관적일 수 있습니다.
- 단점: 프로젝트가 커질수록 XML 설정이 복잡해지고, 유지보수가 어려워질 수 있습니다
2. Java Security Configuration (Spring Security Java Config)
@Bean
SecurityFilterChain web(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(authorize -> authorize
.requestMatchers("/resources/**", "/signup", "/about").permitAll()
.requestMatchers("/admin/**").hasRole("ADMIN")
.requestMatchers("/db/**").access(new WebExpressionAuthorizationManager("hasRole('ADMIN') and hasRole('DBA')"))
.anyRequest().denyAll()
);
return http.build();
}
Spring Security 3.2 이후 도입된 방식으로, 코드 내에서 직접 보안 설정을 할 수 있는 방법입니다.
/resources/**, /signup, /about 경로는 모든 사용자에게 허용되지만, /admin/**는 "ADMIN" 역할을 가진 사용자만 접근할 수 있습니다. 또한 /db/** 경로는 "ADMIN"과 "DBA" 권한을 모두 가진 사용자에게만 허용됩니다.
- 장점: 코드 내에서 보안 설정을 작성하기 때문에 IDE 지원을 받아 설정을 쉽게 관리할 수 있습니다. 특히, 람다식을 활용한 직관적인 설정이 가능합니다.
- 단점: 보안 로직이 코드에 포함되므로, 보안 관련 설정이 코드와 뒤섞일 수 있습니다.
✔️ Method Security
: 사용자의 Role(역할) 기반으로 한 메소드 접근 제어 기능을 제공합니다.
UserDetails 객체를 생성하고, 어노테이션을 활용하여 메소드 접근을 제어하는 방법에 대한 예시 코드입니다.
Member클래스
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import org.springframework.security.core.userdetails.UserDetails;
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@ToString
public class Member implements UserDetails {
private String id; // username
private String password; // password
private String name;
// ... (추가 코드가 있을 수 있습니다)
}
- Member 클래스는 UserDetails를 구현하고 있으며, 사용자 ID, 비밀번호, 이름 등의 정보를 포함합니다. 이 클래스를 통해 사용자의 인증 정보가 관리됩니다.
BankService 인터페이스
import org.springframework.security.access.prepost.PreAuthorize;
public interface BankService {
@PreAuthorize("hasRole('USER')")
Account readAccount(Long id);
@PreAuthorize("hasRole('USER')")
List<Account> findAccounts();
@PreAuthorize("hasRole('TELLER')")
Account post(Account account, Double amount);
}
BankService 인터페이스에서는 @PreAuthorize 어노테이션을 사용하여 메소드 접근을 제어합니다. 이 어노테이션은 특정 역할을 가진 사용자만 해당 메소드를 호출할 수 있도록 제한합니다.
- readAccount(Long id): USER 역할을 가진 사용자만 접근할 수 있습니다.
- findAccounts(): 마찬가지로 USER 역할이 필요합니다.
- post(Account account, Double amount): 이 메소드는 TELLER 역할을 가진 사용자만 호출할 수 있습니다.
참으로 시간이 빠른 것 같아요 ! 봄에 시작했던 KB IT's Your Life가 어느새 프로젝트를 시작하며 마지막을 앞두고 있네요 총총,, 아쉬움도 가득하고 혼자 설 생각에 두려움도 가득하지만 제일 큰 건 부푼 기대감입니다 !!!
다음 주는 정말정말 프로젝트 이야기로 만나뵐 것 같아요 :) 팀원들도 멘토들도 강사님도 모두 다 최고랍니다 ㅎㅎ !! 자랑하러 오겠습니다 !
이상으로 이번 주도 포스팅을 마치겠습니다. 우리 다음 주도 화이팅 ~!~!~!!~

'[KB IT's Your Life] Today I Learnd' 카테고리의 다른 글
| [KB IT's Your Life] 종합실무프로젝트2 💡 (4) | 2024.09.30 |
|---|---|
| [KB IT's Your Life] 8주차 종합실무프로젝트💡 (8) | 2024.09.18 |
| [KB IT's Your Life] 6주차 컴포넌트 백엔드: 게시판 만들기💡 (3) | 2024.09.02 |
| [KB IT's Your Life] 5주차 컴포넌트 백엔드: Rest 실습 프로젝트💡 (0) | 2024.08.26 |
| [KB IT's Your Life] 4주차 컴포넌트 백엔드: MyBatis실습 프로젝트💡 (0) | 2024.08.18 |