🥕
TIL
  • [TIL] Studying tech / computer science knowledge
  • KeyMap
  • 알고리즘
    • 복잡도 계산 ( Computational Complexity )
    • DisjointSet-unionFind
    • Bellman-ford Algorithm
    • Dijkstra's Algorithm
    • DP ( Dynamic Programming , 동적 계획법 )
    • 플로이드-워셜 알고리즘 (Floyd-Warshall algorithm)
    • Kruskal's Algorithm
    • 최장 증가 수열 (Longes Increasing Subsequence)
    • Prim's Algorithm
    • 정렬
    • 시간복잡도 와 공간복잡도 ( Time Complexity & Space Complexity )
    • Topological Sort (위상 정렬)
  • 책 읽고난 후 요약
    • 프로그래밍 대회에서 배우는 알고리즘 문제해결 전략
    • cleancode
    • 도메인 주도 설계로 시작하는 마이크로서비스 개발
    • 오브젝트
  • CDC
    • debzium
    • kafka
  • 개발 상식
    • asciidoctor
    • 컴파일러
    • ELK 스택
    • 엔디안
    • git
    • Gitmoji
    • 테스트 종류
    • 라이브러리와 프레임워크
    • 정규 표현식
    • REST API
    • 동기와 비동기 / Blocking과 NonBlocking
    • Transaction Script와 Domain Model
    • 디자인 패턴
      • 행동 패턴
      • 객체 생성 패턴
        • 추상 팩토리 패턴
        • 빌더 패턴
        • 팩토리 메서드 패턴
        • [생성 패턴] 프로토 타입 (Prototype Parttern)
        • 싱글톤
      • 구조 패턴
        • 어댑터 패턴
        • 브릿지 패턴
        • 컴포짓(Composite) 패턴
        • 데코레이터
        • 프록시
    • refactoring
      • 중복 코드
      • 전역 데이터
      • 긴 함수
      • 긴 매개변수 목록
      • 가변 데이터
      • 이해하기 힘든 이름
  • 자료구조
    • AVL Tree
    • Splay Tree
    • aaTree
    • array-list
    • 자료구조 시간/공간 복잡도
    • 그래프
    • 힙
    • Red Black Tree
    • stack-queue
    • 트리 ( Tree )
  • DevOps
    • MSA
    • Kubernetes
      • AccessingAPI
      • controller
      • dashboard
      • kubernetes
      • object
      • pod
      • service
      • volume
  • Java
    • 어노테이션
    • 제어문
    • 데이터 타입
    • Enum
    • jvm
    • 연산자
    • thread
    • Java8
      • CompletableFuture
      • Date/Time
      • 어노테이션과 메타스페이스
      • 인터페이스
      • 람다식
      • Optional
      • 스트림
  • JavaScript
    • moduleProject
    • webpack-babel
    • 코어 자바스크립트
      • array
      • 함수 바인딩
      • 데코레이터와 포워딩
      • Class
      • 비교 연산자
      • Date 내장 객체
      • destructuring-assignment
      • function
      • 함수의 prototype 프로퍼티
      • 가비지 컬렉션 ( Garbage Collection )
      • JSON (JavaScript Object Notation)
      • map-set
      • 내장 프로토타입
      • new연산자와 생성자 함수
      • 객체
      • Object.keys, values, entries
      • 옵셔널 체이닝 '?.'
      • 프로퍼티 플래그
      • 프로퍼티 종류
      • 프로토 타입
      • 호출 스케줄링 ( scheduling a call )
      • scope
      • this
      • type-conversions
      • type
      • 함수의 자료형
      • var_let_const
  • Linux
    • 기본 명령어
    • 파일 종류
    • 리눅스
  • 네트워크
    • 응용 계층 ( Application Layer )
    • 오류 검출과 오류 정정
    • Http
    • Http Header
    • 컴퓨터 네트워크란
    • 네트워크 계층
    • 네트워크 제어 영역
    • 전송 계층 ( Transport Layer )
  • PHP
    • Facade
    • composer
    • scopeResolutionOperator
    • Laravel
      • SocialProvider
      • architecture
      • blade
      • controller
      • db
      • dbArchitecture
      • debug
      • eloquent
      • email
      • event
      • exceptionHandling
      • middleware
      • model
      • modelFactory
      • pagingLoading
      • queryBuilder
      • route
      • scout
      • seeding
      • tntsearch
      • validate
      • view
  • React
    • Next.js
    • React 란?
  • Spring
    • Controller
    • 요청이 들어왔을때 스프링이 처리하는 방법 ( 내부구조 )
    • ConfigurationProperties
    • Entity / DTO / VO
    • Maven
    • Repository와 DAO
    • 스프링 빈
    • Spring Framework
    • MVC 패턴
    • 도메인 입력값 검증
    • Spring Cloud
      • Spring Cloud
      • Eureka
    • Spring Data
      • JPA
      • JPA 어노테이션
      • 엔티티 비교
      • 복합 키와 식별 관계 매핑
      • JPA 예외처리
      • 객체지향 쿼리
      • EntityManagerFactory와 EntityManager
      • JPA 최적화
      • 프록시와 연관관계 맵핑
      • 연관관계
      • 상속관계 맵핑
      • 트랜잭션 범위와 영속성 컨텍스트
      • 데이터 타입
      • MySQL 연결
      • Pageable
    • Spring Project들과 library
      • Custom Serialize
      • Elasticsearch Index API
      • Spring HATEOAS
      • lombok (롬복)
      • Model Mapper
      • Object Mapper
      • Representation Model
      • Spring REST Docs
      • Spring Boot
    • Spring Security
      • Spring Security
      • Authentication
      • Authentication Filter
      • Authorization Filter
      • Filter Chain
      • SecurityContext
      • Spring OAuth2.0
    • Spring Test
      • AssertJ
      • Junit5
      • JunitParams
      • Mock Object
  • DataBase
    • ALIAS
    • CONCAT
    • CTE
    • Group By
    • HAVING
    • IFNULL
    • 인덱스
    • JOIN
    • ORDER BY
    • ROLLUP
    • SELECT
    • SELECT DISTINCT
    • SQL
    • WHERE
  • Web 상식
    • OAuth
    • WAS
    • HTTP통신 기반 인증
    • 브라우저
    • CSR 과 SSR
    • HTTPS
    • Web
Powered by GitBook
On this page
  • 권한 계층
  • 웹 계층
  • 서비스 계층
  • 도메인 계층
  • 선언적 방식
  • URL
  • Mehtod
  • 동적 방식
  • URL
  • Method
  • ExceptionTranslationFilter
  • AuthenticationException
  • AccessDeniedException
  • FilterSecurityInterceptor
  • AccessDecisionManager
  • AccessDecisionVoter
  1. Spring
  2. Spring Security

Authorization Filter

권한 계층

웹 계층

URL요청에 따른 메뉴/화면 단위의 레벨 보안

/user ->request -> ROLE_USER

서비스 계층

메서드와 같은 기능단위의 레벨 보안

user() ->invoke-> ROLE_USER

도메인 계층

객체 단위의 레벨 보안

user ->write-> ROLE_USER

선언적 방식

URL

http.antMathcers("/user/**").hasRole("USER")

WebSecurityConfigurerAdapter를 상속받은 클래스에서 configure를 통해서 다음과 같이 선언해 줄 수 있다.

구체적인 범위를 가진 url이 앞에 와야한다.

http
    .antMathcer("/shop/**")
    .authorizeRequest()
        .antMathcers("/shop/login", "/shop/users/**").permitAll()
        .antMathcers("/shop/mypage").hasRole("USER")
        .antMathcers("/shop/admin/pay").access("hasRole('ADMIN') or hasRole('SYS')")
        .anyRequest().authenticated();

/shop하위 도메인에 대해 그 밑의 인증세팅정보를 사용하겠다는 뜻이다. 상위의 antMathcer이 없다면 모든 경로에 대해 authorizeRequest()를 수행

메서드
기능

authenticated()

인증된 사용자 접근 허용

fullyAuthenticated()

remberMe인증 제외한 인증된 사용자 접근 허용

permitAll()

무조건 접근 허용

denyAll()

무조건 접근 허용 x

anonymous()

익명 사용자 접근 허용 (인증된 사용자는 익명사용자에 접근 불가능)

rememberMe()

remberMe를 통해 인증된 사용자 접근 허용

access(String) spEL 표현식의 평가가 true이면 접근 허용

hasRole(String)

특정 역할이 있다면 허용 (ROLE_ prefix생략)

hasAuthority(String)

주어진 권한이 있다면 허용 (ROLE_ prefix 포함)

hasAnyRole(String ...)

주어진 권한이 있다면 접근 허용

hasAnyAuthority(String ...)

주어진 권한중 하나라도 있다면 접근 허용

hasIpAddress(String)

주어진 IP 접근 허용

Mehtod

@PreAuthorize("hasRole('USER')")
@Secured("USER")

Controller에서 위의 어노테이션을 이용하여 각 메서드별로 역할을 부여해줄 수 있다.

@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
public class CustomConfig extends WebSecurityConfigureAdapter{}

설정클래스에 @EnableGlobalMethodSecurity를 이용해 선언해주어야 한다.

동적 방식

DB 연동 프로그래밍

URL

Method

ExceptionTranslationFilter

FilterSecifityIntercepter가 Filter의 맨 마지막에 위치하고 Exception을 Throw한다. ExceptionTranslationFilter는 이 필터 앞에 위치해서 요청을 try~catch로 Intercepter를 감싸 호출하고 있다.

AuthenticationException

인증 예외

  1. AuthenticationEntryPoint

    인터페이스이며 이를 구현한 구현체를 Security가 제공하고 이는 로그인 페이지로 이동하거나, 오류코드 전달등 수행 (Custom하고자 한다면 이를 구현한 구현체를 만들면 된다.)

  2. 인증 예외가 발생하기전의 요청 정보를 저장

    • RequestCache : 사용자의 이전 요청 정보를 세션에 저장하고 이를 꺼내 오는 캐시 매커니즘

      • SavedRequest : 사용자가 요청했던 request 파라미터 값들, 그 당시의 헤더값들 등이 저장

AccessDeniedException

인가 예외

  1. AccessDeniedHandler

Anonymous이거나 RememberMe 인증사용자의 경우 AccessDeniedException이 발생하지만 AccessDeniedHandler로 보내지 않고 AuthenticationException으로 보낸다.

http.exceptionHandling()  //예외처리 기능 설정
        .authenticationEntryPoint(customAuthenticationEntryPoint)  //인증 실패시 처리할 클래스
        .accessDenidedHandler(customAccessDenidedHandler())               //인가 실패시 처리할 클래스

FilterSecurityInterceptor

마지막에 위치한 필터로 인증된 사용자에 대해 특정 요청의 승인/거부 여부를 최종적으로 결정

인증객체 없이 접근을 시도할 경우 AuthetnicationException발생을 시키고 접근권한이 없다면 AccessDeniedException을 발생시킨다.

권한 처리를 AccessDecisionManager에게 맡긴다.

과정

  1. 요청이 마지막 필터인 FilterSecurityInterceptor에게 도달

  2. 인증 여부 체크 후 인증된 객체라면

  3. SecurityMetaDataSource에서 요청 도메인/자원에 필요한 권한/역할 정보 조회

  4. 도메인에 필요한 권한이 존재한다면 AccessDecisionManager에게 전달

  5. AccessDecisionManager에서 AccessDecisionVoter에게 권한 심의 요청

  6. AccessDecisionVoter가 최종 승인 여부 반환

  7. 자원 접근 허용

AccessDecisionManager

접근, 인가 결정을 내리는 인터페이스로 인증된 사용자의 리소스 접근 여부 판단하고, 접근 승인하는데 정책을 결정

  • AffirmativeBased: 접근을 승인하는 voter가 1개 이상

  • ConsesusBased: 과반수

  • UnanimouseBased: 모든 voter가 승인

    Voter : 말그래도 투표자로 의사결정을 내리는 객체들. Manager는 여러개의 Voter를 가질 수 있다.

decide(authentication,object,configAttributes)를 이용해 Voter에게 권한 판단을 심사

AccessDecisionVoter

해당 사용자의 인증level이 특정 object 접근level에 만족하는지 확인

권한 판단 자료

  • Authentication : 인증 정보(user)

  • FilterInvocation : 요청 정보(antMathcer("/user"))

  • ConfigAttributes : 권한 정보 (hasRole("USER"))

결정 방식

  • ACCESS_GRANTED : 승인

  • ACCESS_DENIED : 거절

  • ACCESS_ABSTAIN : 보류

RoleVoter

AccessDecisionVoter 구현체중 하나로 리소스에 접근하기 위해 권한을 사용자가 지니고있는지 확인

WebExpressionVoter

웹 시큐리티에서 사용하는 기본 구현체중 하나로, SpEL표현식에 따른 접근 처리(ROLE_* 매치되는지 확인)

PreviousAuthentication FilterNextFilter Chain

Last updated 3 years ago