[Spring Security] 2. 권한
Jul 25, 2025
![[Spring Security] 2. 권한](https://image.inblog.dev?url=https%3A%2F%2Finblog.ai%2Fapi%2Fog%3Ftitle%3D%255BSpring%2520Security%255D%25202.%2520%25EA%25B6%258C%25ED%2595%259C%26logoUrl%3Dhttps%253A%252F%252Finblog.ai%252Finblog_logo.png%26blogTitle%3Djay0628&w=2048&q=75)
0. Authentication Filter 흐름
UsernamePasswordAuthenticationFilter

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 라는 이름의 필드로 구성한다.


의존성주입 = 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