[Spring Security - 1] 아키텍처 - ContextHolder

배지원·2023년 6월 6일
0

SpringSecurity

목록 보기
1/3

1. Spring Security의 내부구조

간단하게 Spring Security의 내부구조를 보자면

이처럼 SecurityContextHolder > SecurityContext > Authentication > Principal > GrantAuthority 순으로 구성이 되어 있다.

따라서 Principal 이나 GrantAuthority의 값을 받아오기 위해서는

SecurityContext securityContext = SecurityContextHolder.getContext();
Authentication authentication = securityContext.getAuthentication();
authentication.getPrincipal();
authentication.getAuthorities();

이런식으로 작성해서 받아와야 한다.

구조를 알아봤으니 이제 세부적으로 어떤 기능을 수행하는지 확인해봐야겠다.


2. 주요 기능

(1) SecurityContextHolder

Spring Security의 핵심 구성 요소로, 현재 실행 중인 스레드에 대한 보안 컨텍스트 정보를 저장하고 추출할 수 있는 메커니즘을 제공한다. 보안 컨텍스트에는 현재 인증된 사용자에 대한 인증 객체 및 권한 정보(사용자 아이디, 유저이름, 비밀번호 등등)가 포함된다.

SecurityContextHolder의 주요 기능은 다음과 같다.

  • 보안 컨텍스트 저장: 현재 스레드에 대한 보안 컨텍스트 정보를 저장하여, 애플리케이션 내 어디에서나 해당 정보에 쉽게 접근할 수 있다.

  • 보안 정보 검색: 쉽게 현재 인증된 사용자의 인증 객체 및 권한 정보를 검색할 수 있도록 소드를 제공한다. 이를 통해 개발자는 사용자의 권한을 확인하거나 인증 여부를 확정할 수 있다.


(2) SecurityContext

Spring Security에서 중요한 역할을 하는 인터페이스로, 애플리케이션의 보안 관련 정보를 포함하며 현재 스레드의 인증상태와 권한 정보 등을 저장한다.

SecurityContext의 주요 기능은 다음과 같다.

  • 인증 객체 저장: 현재 인증 사용자에 대한 인증 객체를 저장한다. Authentication 객체는 사용자의 신원과 권한 정보를 포함한다.

  • 인증 객체 접근: 보안 컨텍스트에 저장된 인증 객체를 검색하거나 변경할 수 있는 메서드를 제공한다. 이를 통해 개발자는 스레드_context에서 인증 정보를 사용하여 사용자의 권한을 확인하거나 인증 상태를 변경할 수 있다.

SecurityContext 인스턴스는 일반적으로 SecurityContextHolder를 사용하여 현재 스레드에 연결이 되고 애플리케이션 전체에서 현재 인증 상태 및 보안 정보에 쉽게 접근할 수 있다.


(3) Authentication

Spring Security에서 중요한 역할을 하는 인터페이스로, 현재 사용자에 대한 인증 정보를 나타낸다. Authentication 객체는 사용자의 신원 정보 및 인증 상태를 나타내며 권한 및 인가 처리에 필요한 기본 요소를 제공한다.

  • Authentication 객체의 주요 구성 요소는 다음과 같다.

  • Principal: 사용자의 주체 정보를 나타내며, 일반적으로 사용자 이름, ID, 비밀번호, 이메일 등을 포함합니다.

  • Credentials: 주로자의 비밀번호와 같은 인증 증거를 나타냅니다. 인증 프로세스가 완료되면 제거되어야 합니다.

  • Authorities: 현재 사용자에게 부여된 권한의 목록을 나타냅니다. Spring Security에서는 GrantedAuthority 인터페이스의 구현체를 사용하여 각 권한을 나타냅니다. 권한은 일반적으로ROLE_USER, ROLE_ADMIN`과 같은 문자열 형식으로 표현됩니다.

  • Authenticated: 사용자의 인증 상태를 나타내는 부울 값입니다. 인증에 성공하면 true로 설정되고, 그렇지 않으면 false로 설정됩니다.

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Object principal = authentication.getPrincipal();	// 현재 로그인한 사용자의 ID, 이름, 비밀번호, 이메일 등등 저장
List<GrantedAuthority> authorities = (List<GrantedAuthority>) authentication.getAuthorities();		// 현재 로그인한 유저의 권한들을 List 형태로 저장함


이처럼 현재 로그인한 유저의 정보들을 찾을 수 있어서 관리자 페이지에 일반 유저가 접속할려고 할 경우 해당 유저의 정보들을 추출하여 관리자의 정보와 비교한 후에 인가를 해줘서 관리자 페이지 혹은 일반 유저만의 페이지를 구별시킬 수 있다.

profile
Web Developer

0개의 댓글