이 영역을 누르면 첫 페이지로 이동
천천히 꾸준히 조용히 블로그의 첫 페이지로 이동

천천히 꾸준히 조용히

페이지 맨 위로 올라가기

천천히 꾸준히 조용히

천천히 꾸준히 조용히.. i3months 블로그

[Spring Security 6] 메서드 단위 권한 요청

  • 2023.08.12 23:33
  • Spring/Spring Security
반응형

 

 

 

 

스프링 시큐리티는 권한 요청 및 접근 제어를 수행하는 방법으로 크게 두 가지 방법을 제공한다.

 

1. URL 기반 권한 요청

시큐리티 설정 클래스에서 URL을 기반으로 접근 권한을 제어한다.

HttpSecurity 클래스의 authorizeRequests() 메서드를 사용해 구현한다.

 

2. 메서드 수준에서의 권한 요청

특정 애너테이션을 사용해 권한을 제어한다.

클래스의 메서드 단위로 권한을 제어할 수 있다.

 

 

URL 기반 접근 제어만 사용하는 경우도 많지만, 보안 요구사항이 복잡한 경우 두 가지 방법을 함께 사용하기도 한다.

요청이 들어오면 URL 기반 접근 제어가 먼저 실행되고, 그 다음에 메서드 기반의 접근 제어가 수행된다.

 

전반적인 보안은 URL 기반으로, 세부적인 접근 제어는 메서드 수준에서 수행하자.

 

 

 

 

@PreAuthorize("hasRole('ADMIN')")
public void adminOnlyMethod() {
    ...
}

@PreAuthorize("#username == principal.username")
public void editProfile(String username) {
    ...
}

@PostAuthorize("returnObject.username == principal.username")
public UserProfile findProfileByUsername(String username) {    
    return null;
}

 

@PreAuthorize : 메서드가 실행되기 전에 권한을 확인한다.

@PostAuthorize : 메서드가 실행된 후 권한을 확인한다.

 

메서드에 전달된 파라미터 기반으로 접근을 허용하거나 특정 역할을 가진 사용자만 API를 호출하도록 할 때 @PreAuthorize 애너테이션을 사용하고, 

메서드의 실행 결과를 기반으로 접근을 제어해야 하는 경우 @PostAuthorize 애너테이션을 사용하자.

 

내부적으로는 AOP를 사용한다.

 

 

 

@PostFilter("filterObject.owner == authentication.name")
public List<Task> getTasks() {
    
}


@PreFilter(filterTarget="tasks", value="filterObject.owner == authentication.name")
public void deleteTasks(List<Task> tasks) {
    
}

 

 

@PostFilter : 메서드의 반환 값으로 돌려주는 컬렉션을 필터링한다. 

@PreFilter : 메서드에 전달되는 컬렉션을 필터링한다.

 

메서드가 반환하는 컬렉션의 각 요소에 대해 보안 제약을 지정할 때 사용하고,

메서드의 매개변수로 전달되는 컬렉션의 요소에 대해 보안 제약 조건을 지정할 때 사용한다.

 

컬렉션이나 배열에만 적용할 수 있고, 역시 내부적으로 AOP를 사용한다.

 

 

 


 

 

 

스프링 시큐리티 설정 관련 애너테이션에 대해 살펴보자.

 

@EnableWebSecurity

스프링 MVC와 함께 사용할 때 웹 보안을 활성화하는 애너테이션이다.

HTTP 보안을 구성하는 메서드들을 오버라이드한다.

 

spring-boot-starter-security 라이브러리를 사용하면 웹 보안 설정이 자동으로 활성화되니 애너테이션을 생략할 수 있다.

기본 설정보다 더 세밀하게 설정해야 하는 경우 명시적으로 추가하기도 한다.

 

@EnableMethodSecurity

메서드 레벨에 적용되는 보안을 활성화한다.

@PreAuthorize @PostAuthorize @PreFilter @PostFilter 애너테이션을 활성화한다.

다음에 나오는 애너테이션에 의해 대체됐다.

 

@EnableGlobalMethhod

전역 메서드 보안을 활성화한다.

starter 라이브러리를 사용해도 자동으로 활성화되지 않으니 메서드 레벨에 보안을 적용하려면 명시적으로 추가해야 한다.

 

prePostsEnabled, securedEnabled, jsr250Enabled 속성을 가진다. 

 

 

반응형
저작자표시 (새창열림)

'Spring > Spring Security' 카테고리의 다른 글

[Spring Security6] 인증 서버 구축  (0) 2023.08.15
[Spring Security6] OAuth2와 OpenID Connect  (0) 2023.08.13
[Spring Security6] Json Web Token  (0) 2023.08.11
[Spring Security6] Authorization과 Filter  (0) 2023.08.09
[Spring Security6] CORS, CSRF  (0) 2023.08.08

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [Spring Security6] 인증 서버 구축

    [Spring Security6] 인증 서버 구축

    2023.08.15
  • [Spring Security6] OAuth2와 OpenID Connect

    [Spring Security6] OAuth2와 OpenID Connect

    2023.08.13
  • [Spring Security6] Json Web Token

    [Spring Security6] Json Web Token

    2023.08.11
  • [Spring Security6] Authorization과 Filter

    [Spring Security6] Authorization과 Filter

    2023.08.09
다른 글 더 둘러보기

정보

천천히 꾸준히 조용히 블로그의 첫 페이지로 이동

천천히 꾸준히 조용히

  • 천천히 꾸준히 조용히의 첫 페이지로 이동

검색

방문자

  • 전체 방문자
  • 오늘
  • 어제

카테고리

  • 분류 전체보기 (677)
    • Algorithm (205)
      • Data Structure (5)
      • Theory && Tip (33)
      • Baekjoon (166)
      • ALGOSPOT (1)
    • Spring (123)
      • Spring (28)
      • Spring Web MVC (20)
      • Spring Database (14)
      • Spring Boot (6)
      • Spring 3.1 (11)
      • Spring Batch (6)
      • Spring Security (16)
      • JPA (12)
      • Spring Data JPA (5)
      • QueryDSL (4)
      • eGovFramework (1)
    • Programming Language (74)
      • C (25)
      • C++ (12)
      • Java (19)
      • JavaScript (15)
      • Python (1)
      • PHP (2)
    • Computer Science (142)
      • Machine Learning (38)
      • Operating System (18)
      • Computer Network (28)
      • System Programming (22)
      • Universial Programming Lang.. (8)
      • Computer Architecture (4)
      • Compiler Design (11)
      • Computer Security (13)
    • Database (21)
      • Database (7)
      • MySQL (3)
      • Oracle (3)
      • Redis (5)
      • Elasticsearch (3)
    • DevOps (20)
      • Docker && Kubernetes (8)
      • Jenkins (4)
      • Amazon Web Service (8)
    • Mobile (28)
      • Android (21)
      • Flutter (7)
    • 💡 솔루션 (17)
    • 👥 모각코 (9)
    • 💬 기록 (7)
    • 📚 공부 (6)
    • -------------- (25)

최근 글

나의 외부 링크

메뉴

  • 홈
반응형

정보

i3months의 천천히 꾸준히 조용히

천천히 꾸준히 조용히

i3months

블로그 구독하기

  • 구독하기
  • RSS 피드

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. Copyright © i3months.

티스토리툴바