inblog logo
|
jay0628
    Spring Security

    [Spring Security] 2. 권한

    김주희's avatar
    김주희
    Jul 25, 2025
    [Spring Security] 2. 권한
    Contents
    0. Authentication Filter 흐름 1. 권한

    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

    RSS·Powered by Inblog