Notepad

작성 중입니다.

스프링 부트 애플리케이션 보안

  • 실제 상용 환경에 배포하기 전에 반드시 갖춰야 할 보안에 대해 설명

학습 내용

다양한 사용자 정보 저장소를 사용하는 스프링 시큐리티 설정
HTTP 엔드포인트에 라우트 기반 보안 설정 적용
리액티브 엔드포인트에 메서드 수준 보안 적용
권한 검사를 위한 스프링 시큐리티 컨텍스트 연동

스프링 시큐리티 시작하기

스프링 부트 프로젝트에 스프링 시큐리티 의존관계 추가

  • 스프링 시큐리티 테스트를 사용하면 9장에서 주로 다룰 보안 기능을 주요 관심사로 하는 테스트 케이스를 쉽게 작성할 수 있음
<!-- spring-security -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

<!-- spring-security-test -->
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-test</artifactId>
    <scope>test</scope>
</dependency>

스프링 시큐리티는 보안 위험에 대한 최신 방어책을 포함하고 있으며 애플리케이션 사용자를 쉽게 보호할 수 있도록 도와줌

  • 스프링 시큐리티 다중 계층 방식 보안 적용
    • 여러 가지 필터가 생성되고 적절한 순서로 등록됨
    • 웹 페이지에 다양한 지시어가 추가됨
      • 바람직하지 않은 정보가 브라우저 캐시에 유입되는 것 방지
      • 클릭재킹, 세션 고정 공격, 크로스 사이트 스크립트 공격 등 보안 위험 방어
      • 서버 응답에 적절한 보안 헤더 추가
      • 크로스 사이트 요청 위조 방지 활성화

실무 적용

  • 실제 운영환경에 적용하라면 확장성을 고려 필요
  • 저장소를 애플리케이션과 별도로 분리된 도구로 관리하길 원한다면 리액티브 리포지토리와 스프링 시큐리티를 연결해줄 약간의 코드 작성으로 적용 가능
  • 사용자 식별 정보와 비밀번호, 역할이 저장된다는 근본적인 개념은 어떤 저장소를 사용하더라도 같음
  • 스프링 시큐리티는 사용자 정보를 하드 코딩해서 저장할 수 있는 여러 가지 방법을 제공하지만, 데이터 저장소를 연결해서 사용하는 편이 더 쉬움
  • 아이디, 비밀번호, 역할을 저장한다는 기본 개념을 구체적으로 구현하는 것도 전혀 어렵지 않음

코드 추가

  • User 클래스 정의
    • 코드 생략
  • UserRepository 생성
    • 코드 생략
  • 스프링 시큐리티 설정 추가(ReactiveUserDetailsService 빈 추가)
@Configuration
public class SecurityConfig {
    @Bean
    public ReactiveUserDetailsService userDetailsService(UserRepository repository) {
        return username -> repository.findByName(username)
                .map(user -> User.withDefaultPasswordEncoder()
                        .username(user.getName())
                        .password(user.getPassword())
                        .authorities(user.getRoles().toArray(new String[0]))
                        .build());
    }
}

스프링 시큐리티 커스텀 정책

사용자 컨텍스트 접근

메서드 수준 보안

OAuth 보안

  • OAuth는 안전한 위임 접속을 보장하는 공개 프로토콜
  • 서드파티 앱을 통해 소셜 미디어 네트워크에 접속할 때 인증 정보를 입력하지 않아도 됨
  • 스프링 시큐리티 대신 다음과 같은 의존관계 추가 필요
<!-- 컨트롤러에서 스프링 시큐리티 설정 애너테이션과 타입을 사용하기 위해 필요 -->
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
</dependency>
<!-- 애플리케이션이 OAuth 클라이언트로서 OAuth 프로바이더와 통신할 때 필요 -->
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-oauth2-client</artifactId>
</dependency>
<!-- JOSE를 사용할 때 필요 -->
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-oauth2-jose</artifactId>
</dependency>
  • OAuth 프로바이더 등록 부분은 생략(책 참고)

정리

  • 스프링 부트 시큐리티 스타터를 추가해서 데모 애플리케이션 생성
  • 데이터베이스를 통해 사용자 정보를 관리할 수 있도록 스프링 데이터 리포지토리 사용
  • URL 기준 보안 규칙 설정
  • 메서드 수준 보안 설정을 통한 상세한 접근 제어
  • 사용자 관리를 구글 같은 서드파티 OAuth 프로바이더에 위임

참고

profile

Notepad

@Apio

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!