간단하게 Spring Security의 내부구조를 보자면
이처럼 SecurityContextHolder > SecurityContext > Authentication > Principal > GrantAuthority 순으로 구성이 되어 있다.
따라서 Principal 이나 GrantAuthority의 값을 받아오기 위해서는
SecurityContext securityContext = SecurityContextHolder.getContext();
Authentication authentication = securityContext.getAuthentication();
authentication.getPrincipal();
authentication.getAuthorities();
이런식으로 작성해서 받아와야 한다.
구조를 알아봤으니 이제 세부적으로 어떤 기능을 수행하는지 확인해봐야겠다.
Spring Security의 핵심 구성 요소로, 현재 실행 중인 스레드에 대한 보안 컨텍스트 정보를 저장하고 추출할 수 있는 메커니즘을 제공한다. 보안 컨텍스트에는 현재 인증된 사용자에 대한 인증 객체 및 권한 정보(사용자 아이디, 유저이름, 비밀번호 등등)가 포함된다.
SecurityContextHolder의 주요 기능은 다음과 같다.
보안 컨텍스트 저장: 현재 스레드에 대한 보안 컨텍스트 정보를 저장하여, 애플리케이션 내 어디에서나 해당 정보에 쉽게 접근할 수 있다.
보안 정보 검색: 쉽게 현재 인증된 사용자의 인증 객체 및 권한 정보를 검색할 수 있도록 소드를 제공한다. 이를 통해 개발자는 사용자의 권한을 확인하거나 인증 여부를 확정할 수 있다.
Spring Security에서 중요한 역할을 하는 인터페이스로, 애플리케이션의 보안 관련 정보를 포함하며 현재 스레드의 인증상태와 권한 정보 등을 저장한다.
SecurityContext의 주요 기능은 다음과 같다.
인증 객체 저장: 현재 인증 사용자에 대한 인증 객체를 저장한다. Authentication 객체는 사용자의 신원과 권한 정보를 포함한다.
인증 객체 접근: 보안 컨텍스트에 저장된 인증 객체를 검색하거나 변경할 수 있는 메서드를 제공한다. 이를 통해 개발자는 스레드_context에서 인증 정보를 사용하여 사용자의 권한을 확인하거나 인증 상태를 변경할 수 있다.
SecurityContext 인스턴스는 일반적으로 SecurityContextHolder를 사용하여 현재 스레드에 연결이 되고 애플리케이션 전체에서 현재 인증 상태 및 보안 정보에 쉽게 접근할 수 있다.
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 형태로 저장함
이처럼 현재 로그인한 유저의 정보들을 찾을 수 있어서 관리자 페이지에 일반 유저가 접속할려고 할 경우 해당 유저의 정보들을 추출하여 관리자의 정보와 비교한 후에 인가를 해줘서 관리자 페이지 혹은 일반 유저만의 페이지를 구별시킬 수 있다.