[Spring Security] 2. 권한

김주희's avatar
Jul 25, 2025
[Spring Security] 2. 권한

0. Authentication Filter 흐름

UsernamePasswordAuthenticationFilter
notion image
 

1. 권한

권한

Spring Security에서 체킹하는 권한이란 파일 읽기, 쓰기와 같은 자원에 대한 권한이 아닌 admin 페이지에는 ROLE_ADMIN만이 접근 가능한 것과 같이 특정 페이지나 컨트롤러에 대한 접근 제어 권한을 의미한다.
 
자원에 대한 권한의 경우, db 조회가 필요하기 때문에 controller 단에서 처리가 불가능하다. controller의 책임은 외부의 요청을 잘 받아서 응답하는 것이고 service에 위임하여 service 단에서 비지니스 로직 처리의 책임을 가진다. (repository를 db와의 communication의 책임을 가짐) 따라서 자원에 대한 권한은 service에서 확인 및 처리 가능하다.
 
또한 권한은 인증이 됐다는 전제 하에 확인 가능한 것이다.
예를 들어 /main 의 경우 인증만 되면 들어올 수 있지만 /user/** 의 경우 인증이 된 이후에 ROLE_USER인 유저만 들어올 수 있도록 권한을 체크하게 된다.
 

User 클래스 권한 필드 추가

기존의 User 클래스에서 role은 Enum으로 처리했었지만 하나의 유저가 여러 개의 권한을 가질 수 있는 경우 Enum으로 처리 불가능하다. 즉 db 상에 role 컬럼에 (USER) 혹은 (ADMIN) 이런식으로만 들어가는 것이 아니라 (USER,ADMIN)처럼 두 개 이상의 권한을 “,”으로 구분해서 한 번에 담아서 쓸 것이기 때문에 String 타입의 roles 라는 이름의 필드로 구성한다.
notion image
 
 
 
 
 
notion image
 
 
 
 
 
 
 
 
 
 
 
 
 
 
의존성주입 = ioc 컨테이너에 떠있는거 ?로 가져오는것
 

인증이 되어있어야 권한 체킹이 가능하다.
 
GrantedAuthority e 넣는
방법 1. 내부 클래스 만들어서 new
방법 2. 람다 사용
add에 담고 싶은것 = 행위 = 메서드
 
getAuthorities 는 User가 가진 roles를 return해주는 것
 
role 컬랙션으로 쓰면 복잡해짐..?
 
db에 role 비정규화해서 넣을거임
 

SecurityConfig
하나의 권한에게 통으로 다 주면 나중에 헷갈리기때문에 hasAnyRole를 쓰지 않고 그냥 유저에게 권한(role)을 여러개 주도록 하자
 
 
Authentication.getAuthorities를 호출하면 User의 getAuthorites
getAuthorities로 할때는 user라고 되어있으면 User 권한이라고 인식 못함 ⇒ ROLE_이라는 접두사가 필요함
⇒ db에 넣을때부터 ROLE_ 붙여서 써도 됨(Security를 위한 일이기 때문에 db상에 ROLE_을 붙이는건 별로 다른 서버에서는 안쓰니까 지워서 써야되니까 그냥 순수하게 db에 넣어두는게 낫다)
 

권한

 
Share article

jay0628