티스토리 뷰
비유: 공항 보안 검색대와 탑승 게이트
- 승객 (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()
미들웨어 역할:- 이 미들웨어는 HTTP 요청 헤더에서
Authorization
헤더를 찾습니다. Bearer
접두사가 붙은 토큰을 발견하면,Program.cs
에서 설정된AddJwtBearer
구성(비밀 키, 발행자, 수신자, 만료 시간 등)을 사용하여 토큰의 유효성을 검증합니다.- 토큰이 유효하면: 토큰 안에 담긴 사용자 정보(클레임, 예: 사용자 ID, 이름, 역할)를 파싱합니다. 그리고 이 정보를 바탕으로
ClaimsPrincipal
객체를 생성하고, 이 객체를 현재 HTTP 요청의HttpContext.User
속성에 할당합니다. 이제 ASP.NET Core는 '이 요청을 보낸 사용자는 누구'인지 알게 됩니다. (승객의 신분증을 확인하고 '이 사람이 김철수구나!' 하고 파악하는 단계) - 토큰이 유효하지 않거나 없으면:
HttpContext.User
는 인증되지 않은 상태로 유지되거나,401 Unauthorized
(인증되지 않음) 응답을 반환할 수 있습니다.
- 이 미들웨어는 HTTP 요청 헤더에서
- 결과: 이 단계가 끝나면,
HttpContext.User
에는 인증된 사용자의 정보가 담겨 있거나 (인증 성공), 그렇지 않거나 (인증 실패) 둘 중 하나입니다.
단계 2: app.UseAuthorization()
미들웨어 작동 및 [Authorize]
속성 체크
- 승객이 탑승 게이트에 도착:
UseAuthentication()
미들웨어를 통과한 요청은 다음 미들웨어인app.UseAuthorization()
으로 전달됩니다. app.UseAuthorization()
미들웨어 역할:- 이 미들웨어는 HTTP 요청이 매칭될 컨트롤러 액션에
[Authorize]
속성이 있는지 확인합니다. ([Authorize]
속성은 일종의 '탑승권 확인' 지시입니다.) [Authorize]
속성이 있다면,app.UseAuthorization()
은HttpContext.User
의 정보를 가져와서 인가(Authorization) 검사를 수행합니다.- 기본
[Authorize]
: 단순히 사용자가 인증되었는지(HttpContext.User.Identity.IsAuthenticated
) 확인합니다. [Authorize(Roles = "Admin")]
: 사용자가 인증되었고, 추가적으로 JWT 토큰에 "Admin" 역할 클레임이 포함되어 있는지 확인합니다.- 정책 기반 인가: 더 복잡한 규칙(예: "만 19세 이상이면서 프리미엄 구독자인가?")을 확인합니다.
- 기본
- 인가 성공 시: 요청은 다음 미들웨어(컨트롤러)로 계속 진행됩니다. (승객이 탑승 게이트를 통과하여 비행기에 탑승)
- 인가 실패 시:
- 사용자가 인증되지 않은 경우 (토큰이 없거나 유효하지 않음):
401 Unauthorized
응답을 반환합니다. (신분증이 없거나 위조된 승객에게 "탑승 거부! 신분증 먼저 가져오세요!"라고 알림) - 사용자는 인증되었지만 권한이 없는 경우 (토큰은 유효하나 역할이 부족):
403 Forbidden
응답을 반환합니다. (일반석 승객이 퍼스트 클래스 게이트로 가려 할 때 "탑승권으로는 여기 못 지나갑니다!"라고 알림)
- 사용자가 인증되지 않은 경우 (토큰이 없거나 유효하지 않음):
- 이 미들웨어는 HTTP 요청이 매칭될 컨트롤러 액션에
단계 3: 컨트롤러 액션 메서드 실행
- 승객이 비행기 좌석에 착석: 모든 인증 및 권한 부여 검사를 통과한 요청은 비로소 해당 컨트롤러의 액션 메서드를 실행합니다.
- 이 시점에서
HttpContext.User
에는 완전히 인증되고 권한이 검증된 사용자의 정보가 담겨 있으므로, 액션 메서드 내에서 안전하게 사용자 정보를 활용할 수 있습니다.
요약 흐름도
클라이언트 요청 (Authorization: Bearer 토큰)
|
V
app.UseAuthentication() 미들웨어 (신분증 확인)
| (토큰 유효성 검증 -> HttpContext.User에 사용자 정보 설정)
V
app.UseAuthorization() 미들웨어 (탑승권 확인 - [Authorize] 속성 규칙 적용)
| (HttpContext.User 기반으로 인증/권한 검사)
V
컨트롤러 액션 메서드 실행 (비행기 좌석 착석)
추가 정보
[Authorize]는 "당신이 누구인지(인증) 확인된 후에,
당신이 이 특정 리소스에 접근할 권한이 있는지(권한 부여) 체크해라" 라고 지시하는 것입니다.
728x90
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- 문자 자르기
- system.io
- java web-mvc
- 스프링 프레임워크(spring framework)
- In App Purchase
- java.sql
- 진수 변환
- java-개발 환경 설정하기
- jstl(java standard tag library)
- 인텔리제이(intellij)
- System.Diagnostics
- 스프링 프레임워크(spring framewordk)
- nl2br
- await
- REST API
- error-java
- 스프링 시큐리티(spring security)-http basic 인증
- MainActor
- jstl(java standard tag library)-core
- java 키워드 정리
- 제품 등록
- docker
- 메이븐(maven)
- 특정 문자를 기준으로 자르기
- 람다식(lambda expression)
- jsp 오픈 소스
- .submit()
- 스프링 시큐리티(spring security)
- 표현 언어(expression language)
- React
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
글 보관함