본문 바로가기

Spring Boot/유저 관리 기능

인가와 권한 관리 : 인가

Authorization

 

- 인가의 개념

- 인증과 인가의 차이

- 인가가 필요한 이유와 그 역할

- 인증 이후 인가가 어떤 프로세스로 이어지는가

- 보안 시스템에서 인증과 인가가 어떻게 맞물려 동작하는가


인가(Authorization)

인증된 사용자가 어떤 자원(Resource)에 접근할 수 있는지 결정하는 과정임

  • 인증(Authentication) : 사용자가 누구인지 확인하는 절차
  • 인가(Authorization) : 인증된 사용자가 무엇을 할 수 있는지 결정하는 절차

인증은 건물 현관에서 신분증을 보여주고 본인 확인을 하는 절차

인가는 건물 안에서 특정 방에 들어갈 수 있는 권한이 있는지 확인하는 과정임

 

 

1. 인증과 인가의 차이점

구분 인증(Authentication) 인가(Authorization)
목적 사용자가 누구인지 확인함 사용자가 무엇을 할 수 있는지 결정함
예시 로그인시 아이디와 비밀번호를 검증함 관리자만 게시글 삭제 가능
시점 항상 먼저 수행됨 인증 후에 수행됨
결과 사용자의 신원 확인 권한에 따른 접근 제어

 

 

2. 인가의 필요성과 역할

 - 보안 강화 : 인증만으로는 보안이 충분치 않으며, 각 사용자마다 허용된 범위를 제한해야만 한다

 - 자원 보호 : 중요 데이터나 관리자 기능은 권한이 있는 사용자만 접근할 수 있어야한다

 - 사용자 경험 : 불필요한 접근을 막아 사용자가 본인 권한 범위 내에서만 기능을 이용하도록 도와야한다

 

영화관에서 티켓을 구매(인증)했더라도, 1관 티켓이면 1관(인가)에만 입장할 수 있어야한다

회사에서 사원증으로 출입(인증)하지만, 부서별 권한(인가)에 따라 특정 층이나 회의실만 출입할 수 있어야한다

 

 

3. 이걸 왜 분리해야 하는가?

  • 보안의 경계를 명확하게 : 인증은 신원 확인, 인가는 행위 허용 여부가 된다. 섞이면 신원 미확정 상태에서 권한을 부여하는 오류가 생길 수 있다.
  • 책임 분리(SRP) : 인증 모듈은 크리덴결 검증에 집중하고, 인가 모듈은 정책(규칙) 판단에 집중한다. 따라서 코드가 단순해지고 테스트가 용이해지며, 유지보수가 수월해진다
  • 정책 진화, 확장 용이 : 비즈니스가 커질수록 권한 규칙은 잦은 변경이 필요하다. 인증과 분리하면 정책만 바꿔도 된다
  • 감사, 추적(Audit) 품질 향상 : 누가(인증) 무엇을 시도했고(행위), 외 허용 / 거부되었는지(정책) 에 대한 부분을 분리해서 로깅하면 사고 분석이 수월해진다.
  • 취약점 예방 : 섞이게 되면 대표적으로 IDOR(수평 권한 상승), 권한 누락 체크 같은 문제가 자주 발생할 수 있다.

 

 

4. 인증 후 인가 프로세스 워크플로우

인증 이후 인가 워크플로우

PEP(Policy Enforcement Point) : 검사 적용 지점

PDP(Policy Decision Point) : 정책 판단 지점

규모가 작으면 둘을 하나의 프로세스에서 구현하는 방법도 있다

 

인증 이후

API 서버에서 PDP에 권한에 대해 물어봄 - > PDP가 DB 저장소에서 정책 / 속성을 조회하고 반환해줌

- > 이에 대해 PDP가 API 서버로 허용 / 거부를 결정하고 근거와 함께 보내준다

- > 이걸 API서버가 클라이언트에게 반환해줌

 

 

5. 왜 인가는 항상 인증 이후여야 하는가?

  • 신원 미확정 상태에서는 권한 판단 불가 : 권한은 주체(사용자 / 시스템)에 귀속된다. 주체가 확정되기 전에는 정책을 적용할 대상이 없다.
  • 토큰 / 세션 위조 방지 : 먼저 신원(토큰 / 세션) 유효성, 무결성을 검증해야 이후 권한 검사 의미가 생긴다.
  • 오류시 안전한 기본값(Fail-close) : 인증 실패는 즉시 401로 닫아야 하며, 인증 성공 이후에만 인가로 세분화(403)한다.

 

* 401 Unauthorized(인증 실패 / 누락) : 누군지 확인되지 않음 -> 먼저 로그인 / 자격 제시 필요

* 403 Forbidden(인가 실패) : 누군지는 알지만 해당 작업에 대한 권한이 없음


* 인증과 인가를 항상 구분해서 설계해야함. 로그인 성공이 곧 모든 권한 허용을 의미하진 않는다

* 인가는 보통 역할(Role)이나 권한(Permission) 체계를 통해 관리된다

* 보안 사고 예방을 위해 최소 권한 원칙(Principle of Least Privilege)을 적용하는게 좋다