본문 바로가기

Spring Boot/Security 쿠키,세션 기반 인증,인가

세션 기반 사용자 인가 구현 : 인증과 인가의 관계

 - 세션 기반 인가(Authorization) 의 기본 개념

 - 인증(Authentication), 인가(Authorization) 의 차이

 - Spring Security 의 SecurityContext 와 Authentication 객체 구조

 - GrantedAuthority 를 활용해서 권한 정보를 표현하는 법

 - 세션에 저장된 권한 정보를 통해 접근 제어가 이뤄지는 과정


세션 기반 인가 개요

웹 애플리케이션에서 인가(Authorization) 이란, 사용자가 특정 리소스나 기능에 접근할 수 있는지를 결정하는 과정을 말한다

세션 기반 인증이 완료되면, 서버는 세션(session) 안에 사용자의 정보를 저장한다
이후 사용자의 모든 요청은 세션에 담긴 정보를 통해 인가 과정을 거친다

세션 기반 인가 개요


인증과 인가의 관계

1. 인증(Authentication)

인증은 사용자가 누구인지 확인하는 과정이다

아이디와 비밀번호를 입력하여 본인이 맞음을 확인하는 단계임

  1. 사용자가 아이디 / 비밀번호 입력
  2. 서버가 DB에서 사용자를 검증함
  3. 성공시 세션 생성 및 사용자의 정보 저장

 

 

2. 인가(Authorization)

인가는 인증된 사용자가 어떤 권한을 가지고 있는지 확인하는 과정임

로그인된 사용자가 관리자의 권한을 가지고 있는가에 대한 검증 등을 통해 접근을 허용하거나 차단한다

 

  인증(Authentication) 인가(Authorization)
목적 사용자가 누구인가 사용자에게 어떤 권한이 있는가
결과 로그인 성공 / 실패 접근 허용 / 거부

 

 

  • 인증은 "누구인지"에 대한 확인임
  • 인가는 "무엇을 할 수 있는지"에 대한 확인임
  • 두 개념은 혼동하지 말아야한다

SecurityContext 와 Authentication 객체

Spring Security 에서는 사용자가 로그인에 성공하면 Authentication 객체가 생성되어 SecurityContext 에 저장된다

이 정보는 세션을 통해 유지되며, 요청마다 인가 검증에 활용된다

 

1. SecurityContext 구조

SecurityContext에 저장된 객체는 Authentication, UserDetails 를 포함하고 있어서, 사용할 수 있다

 

  • SecurityContext : 현재 보안 정보를 담고 있는 컨테이너
  • Authentication : 인증된 사용자 정보를 표현하는 객체
  • UserDetails : 사용자 ID, 비밀번호, 권한 목록을 포함한 객체

 

2. Authentication 객체 주요 필드

필드명 설명
principal 사용자의 정보(보통 UserDetails)
credentials 사용자의 비밀번호(인증후 null 처리)
authorities 사용자의 권한 목록(ROLE_USER, ROLE_ADMIN 등)

 

 

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
String username = authentication.getName();
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities(); // 권한 리스트

 

 

  • SecurityContextHolder 를 통해 언제든 현재 로그인한 사용자 정보를 가져올 수 있다
  • 세션 기반이므로, 서버 재시작시 세션이 초기화되면 다시 로그인해야한다

 

항목 설명
SecurityContext 현재 인증 정보를 보관함
Authentication 인증된 사용자의 세부 정보 활용
principal 사용자의 객체(UserDetails)
authorities 권한 목록

GrantedAuthority 를 통한 권한 표현하기

Spring Security 에서 권한은 GrantedAuthority 인터페이스로 표현된다

일반적으로 문자열 형태의 권한 값(ROLE_USER, ROLE_ADMIN) 으로 사용된다

 

1. GrantedAuthority 예시

UserDetails user = User.withUsername("b1uffer")
    .password({noop}1234)
    .roles("USER") // ROLE_USER
    .build();

 

roles("USER") 는 내부적으로 ROLE_USER 라는 권한을 GrantyAuthority 로 생성한다

 

 

2. 권한 검증 흐름

GrantedAuthority 권한 검증 흐름

 

 

  • 권한 이름은 일반적으로 ROLE_ prefix 를 붙여서 사용한다
  • 여러가지 권한을 동시에 가질 수 있으며, Collection<? extends GrantedAuthority> 로 관리된다
  • 권한은 단순 문자열 비교이므로, 일관된 네이밍 규칙을 유지하는게 중요하다

 

항목 설명
GrantedAuthority 권한 표현 인터페이스
ROLE_USER 일반 사용자 권한
ROLE_ADMIN 관리자 권한