spring/spring security

Spring Security 기본 개념 공부 6. (권한 부여와 인증 방법)

대기업 가고 싶은 공돌이 2024. 5. 26. 02:18

Section 7.

인증과 인가의 차이

  • 인증은 사용자가 api에 접근이 가능한 사용잔가 아닌가를 구별하는 것이다.
  • 인가란 권한부여로서 특정 api에 접근이 가능한 권한을 설정하여, 해당 권한이 있는 사람만 해당 api에 접근할 수 있도록 설정하는 것이다.
    • 항상 인증이 먼저 일어나고 그 이후에 인가가 발생한다.
    • 인증을 통해 로그인을 하고 어느 부분까지 접근할 수 있냐를 인가로 판단하는것이다.
  • 인증에서는 아이디, 비밀번호, OTP 등의 정보를 필요로한다.
  • 권한 부여에서는 자격증명관련 정보는 전혀 필요로 하지 않고, 역할이나 특권에 대한 정보만을 필요로한다.
  • 인증 실패는 401 에러코드가 뜨고, 권한이 없을 시엔 403 에러코드가 발생한다.

유저의 권한과 역할이 저장되는 곳

public interface GrantedAuthority extends Serializable {
    String getAuthority();
  • 다음과 같이 GrantedAuthority라는 인터페이스가 있다.
  • 이 GrantedAuthority의 구현체는 simpleGrantedAuthority이다.
  • 권한 또는 역할을 부여하고 싶다면 simpleGrantedAuthority를 생성함과 동시에 인자에 문자열로 권한 혹은 역할을 넘겨줘야한다.
  • 그러면 해당 내용이 simpleGrantedAuthority내부에 저장된다.
  • 맨 처음 유저를 생성할 때 역할을 한 번 설정해주었다면 이후에 역할을 수정하는 방법은 존재하지 않는다.
  • 그러면 권한 정보는 어디에 저장되는 것일까
if (passwordEncoder.matches(pwd, customer.get(0).getPwd())) {
                List<GrantedAuthority> authorities = new ArrayList<>();
                authorities.add(new SimpleGrantedAuthority(customer.get(0).getRole()));
                return new UsernamePasswordAuthenticationToken(username, pwd, authorities);
  • 위의 코드는 우리가 만들었던 AuthenticationProvider다.
  • 내부에 authorities를 저장하는 부분이있다.
  • 맨 처음 유저를 생성할때 저장한 Role을 UsernamePasswordAuthenticationToken에 생성자로 넘겨준다.
  • 한 가지 저장방법이 더 있다. User 객체 생성자에 authorities를 넘겨주는 것이다.
  • 우리는 Authentication 토큰과 UserDetails 객체 두 가지에서 authorities를 얻어서 활용할 수 있다.

유저에게 여러가지 권한을 부여하는 방법

  • 해당 강의에서 제시하는 방법은 다른 authorities 테이블을 생성하여 외래키로 연결시켜두는 방식이다.

스프링시큐리티 내부의 권한 부여와 관련된 메소드

    1. hasAuthority(), 이 메소드는 사용자가 특정 권한을 가지고 있는지 확인하는 메소드이다. 만약 admin의 권한을 가진 사람만이 특정 api를 사용할수 있기를 바란다면, hasAuthority("admin") 이런 방식으로 확인해주면 된다.
    2. hasAnyAuthority(), 이 메소드는 한 가지의 권한이 아닌 여러가지 권한을 확인하는 메소드이다. 여러가지 권한을 설정해두고, 만약 유저가 한 가지라도 권한을 가지고 있다면 해당 api에 접근할 수 있게 해준다.
    3. access(), 해당 메소드로 Spring Expression Laguage의 도움을 받아 복잡한 권한 부여의 규칙을 구성할 수 있다.
  • 위의 메소드들은 requestMatcher 이후에 설정하여 사용할 수 있다.
    • EX) requestMatchers("/myAccount").hasAuthority("VIEWACCOUNT")

Authority와 role의 차이점

  • Authority는 api 하나 하나에 접근할 수 있냐 없냐를 나타내는 세밀한 작업이다.
    • Authority의 예시를 본다면 VIEWACCOUNT, VIEWCARDS등 단위 작업을 표시하고 있다.
  • role은 그러한 Authority의 집합을 의미한다.
    • 회사를 생각해보면 부장이라는 role에 주어진 Authority, 과장이라는 role에 주어진 Authority ,,, 정도로 생각하면 된다.
  • Spring Security에서 Authority와 Role을 저장하고 사용하는 방식은 동일하다. 그렇기에 이를 구별하기 위해 role은 반드시 접두사로 ROLE_을 가져야한다. EX) ROLE_ADMIN

스프링 시큐리티 내부의 역할 부여와 관련된 메소드

    1. hasRole(), 한 가지 특정 역할을 가지고 있는지 확인하는 메소드이다.
    2. hasAnyRole(), 여러가지 역할을 확인하는 메소드이다. 만약 유저가 한 가지라도 권한을 가지고 있다면 접근을 허용한다.
    3. access(),해당 메소드로 Spring Expression Laguage의 도움을 받아 복잡한 역할 부여의 규칙을 구성할 수 있다. EX( or, not 등의 조건이 가능해진다.
  • 한 가지 주의할 점은 데이터베이스에는 역할을 접두사 ROLE_을 붙여서 저장하지만, 위의 메소드들을 호출할 때는 ROLE_을 붙이면 안된다는 것이다.
    • 이유는 위의 메소드들을 호출할때 자동으로 ROLE_이 앞에 붙여지기 때문이다.
  • 사용 방법도 Authority와 유사하다.
    • 위의 메소드들은 requestMatcher 이후에 설정하여 사용할 수 있다.
    • EX) requestMatchers("/myAccount").hasRole("User")