Back End/🌈 ASP.NET

ASP.NET Core 웹 API-인증과 권한 이해하기

James Wetzel 2025. 6. 12. 19:43

비유: 공항 보안 검색대와 탑승 게이트

  • 승객 (Client): HTTP 요청을 보내는 사용자.
  • 보안 검색대 (app.UseAuthentication()): 승객의 신분증(JWT 토큰)을 확인하여 '이 사람이 누구인지'를 인증하는 곳.
  • 탑승 게이트 (app.UseAuthorization()): 신분증(인증)이 확인된 승객이 '이 비행기(보호된 리소스)를 탈 수 있는 자격(권한)이 있는지'를 확인하는 곳.
  • 탑승권 ([Authorize] 속성): 특정 비행기에 탑승하기 위해 필요한 자격(예: 퍼스트 클래스 승객, 특정 목적지 승객)을 나타내는 표식.

[Authorize] 속성 처리 과정 (단계별 설명)

[Authorize] 속성이 붙은 API 엔드포인트에 요청이 들어오면, ASP.NET Core는 다음 단계를 거쳐 요청을 처리합니다.

단계 1: 요청 진입 및 app.UseAuthentication() 미들웨어 작동

  • 승객이 보안 검색대에 도착: 클라이언트(웹 브라우저나 모바일 앱)가 보호된 API 엔드포인트(예: /Protected)로 HTTP 요청을 보냅니다. 이때 요청 헤더에는 Authorization: Bearer <JWT 토큰>이 포함되어 있습니다.
  • app.UseAuthentication() 미들웨어 역할:
    1. 이 미들웨어는 HTTP 요청 헤더에서 Authorization 헤더를 찾습니다.
    2. Bearer 접두사가 붙은 토큰을 발견하면, Program.cs에서 설정된 AddJwtBearer 구성(비밀 키, 발행자, 수신자, 만료 시간 등)을 사용하여 토큰의 유효성을 검증합니다.
    3. 토큰이 유효하면: 토큰 안에 담긴 사용자 정보(클레임, 예: 사용자 ID, 이름, 역할)를 파싱합니다. 그리고 이 정보를 바탕으로 ClaimsPrincipal 객체를 생성하고, 이 객체를 현재 HTTP 요청의 HttpContext.User 속성에 할당합니다. 이제 ASP.NET Core는 '이 요청을 보낸 사용자는 누구'인지 알게 됩니다. (승객의 신분증을 확인하고 '이 사람이 김철수구나!' 하고 파악하는 단계)
    4. 토큰이 유효하지 않거나 없으면: HttpContext.User는 인증되지 않은 상태로 유지되거나, 401 Unauthorized (인증되지 않음) 응답을 반환할 수 있습니다.
  • 결과: 이 단계가 끝나면, HttpContext.User에는 인증된 사용자의 정보가 담겨 있거나 (인증 성공), 그렇지 않거나 (인증 실패) 둘 중 하나입니다.

단계 2: app.UseAuthorization() 미들웨어 작동 및 [Authorize] 속성 체크

  • 승객이 탑승 게이트에 도착: UseAuthentication() 미들웨어를 통과한 요청은 다음 미들웨어인 app.UseAuthorization()으로 전달됩니다.
  • app.UseAuthorization() 미들웨어 역할:
    1. 이 미들웨어는 HTTP 요청이 매칭될 컨트롤러 액션에 [Authorize] 속성이 있는지 확인합니다. ([Authorize] 속성은 일종의 '탑승권 확인' 지시입니다.)
    2. [Authorize] 속성이 있다면, app.UseAuthorization()HttpContext.User의 정보를 가져와서 인가(Authorization) 검사를 수행합니다.
      • 기본 [Authorize]: 단순히 사용자가 인증되었는지(HttpContext.User.Identity.IsAuthenticated) 확인합니다.
      • [Authorize(Roles = "Admin")]: 사용자가 인증되었고, 추가적으로 JWT 토큰에 "Admin" 역할 클레임이 포함되어 있는지 확인합니다.
      • 정책 기반 인가: 더 복잡한 규칙(예: "만 19세 이상이면서 프리미엄 구독자인가?")을 확인합니다.
    3. 인가 성공 시: 요청은 다음 미들웨어(컨트롤러)로 계속 진행됩니다. (승객이 탑승 게이트를 통과하여 비행기에 탑승)
    4. 인가 실패 시:
      • 사용자가 인증되지 않은 경우 (토큰이 없거나 유효하지 않음): 401 Unauthorized 응답을 반환합니다. (신분증이 없거나 위조된 승객에게 "탑승 거부! 신분증 먼저 가져오세요!"라고 알림)
      • 사용자는 인증되었지만 권한이 없는 경우 (토큰은 유효하나 역할이 부족): 403 Forbidden 응답을 반환합니다. (일반석 승객이 퍼스트 클래스 게이트로 가려 할 때 "탑승권으로는 여기 못 지나갑니다!"라고 알림)

단계 3: 컨트롤러 액션 메서드 실행

  • 승객이 비행기 좌석에 착석: 모든 인증 및 권한 부여 검사를 통과한 요청은 비로소 해당 컨트롤러의 액션 메서드를 실행합니다.
  • 이 시점에서 HttpContext.User에는 완전히 인증되고 권한이 검증된 사용자의 정보가 담겨 있으므로, 액션 메서드 내에서 안전하게 사용자 정보를 활용할 수 있습니다.

요약 흐름도

클라이언트 요청 (Authorization: Bearer 토큰)
      |
      V
app.UseAuthentication() 미들웨어 (신분증 확인)
      | (토큰 유효성 검증 -> HttpContext.User에 사용자 정보 설정)
      V
app.UseAuthorization() 미들웨어 (탑승권 확인 - [Authorize] 속성 규칙 적용)
      | (HttpContext.User 기반으로 인증/권한 검사)
      V
컨트롤러 액션 메서드 실행 (비행기 좌석 착석)

 

추가 정보

[Authorize]는 "당신이 누구인지(인증) 확인된 후에, 
당신이 이 특정 리소스에 접근할 권한이 있는지(권한 부여) 체크해라" 라고 지시하는 것입니다.
728x90
반응형