.Net Core 공식 JWT 권한 수여 검증 의 전 과정

JWT 가 뭐 예요?
JSON 웹 토 큰(JWT)은 개방 기준RFC 7519으로 치밀 하고 자체 적 으로 포 함 된 방식 을 정의 하여 각 측 간 에 정 보 를 안전하게 전송 하 는 데 사용 된다.이 정 보 는 디지털 서명 을 거 쳤 기 때문에 검증 과 신뢰 를 받 을 수 있다.비밀(HMAC 알고리즘 사용)을 사용 하거나 RSA 또는 ECDSA 의 공개 키/비밀 키 를 사용 하여 JWT 에 서명 할 수 있 습 니 다.
비록 JWT 를 암호 화하 여 쌍방 간 의 기밀 성 을 제공 할 수 있 지만,우 리 는 이미 서명 한 영패 에 중점 을 둘 것 이다.서명 한 토 큰 은 그 안에 포 함 된 성명 의 완전 성 을 검증 할 수 있 고 암호 화 된 토 큰 은 이 성명 을 다른 측 앞 에 숨 길 수 있 습 니 다.공개 키/비밀 키 를 사용 하여 토 큰 에 서명 할 때 서명 은 비밀 키 를 가 진 쪽 만 이 서명 하 는 쪽 임 을 증명 합 니 다.안전성 이 부족 하기 때문에 비밀번호 와 같은 민감 한 정 보 를 영패 에 넣 을 수 없다.
JWT 는 언제 사용 해 야 합 니까?
다음은 JSON Web 영패 가 유용 한 경우 입 니 다.
  • 권한 수여:이것 은 JWT 를 사용 하 는 가장 흔 한 방안 이다.사용자 가 로그 인하 면 모든 후속 요청 은 JWT 를 포함 하여 사용자 가 이 토 큰 이 허용 하 는 경로,서비스 와 자원 에 접근 할 수 있 도록 합 니 다.단일 로그 인 은 현재 JWT 를 광범 위 하 게 사용 하 는 기능 입 니 다.비용 이 적 고 서로 다른 도 메 인 에서 쉽게 사용 할 수 있 기 때 문 입 니 다.
  • 정보 교환:JSON 웹 토 큰 은 각 분야 에서 정 보 를 안전하게 전송 하 는 좋 은 방법 이다.JWT 에 서명 할 수 있 기 때문에(예 를 들 어 공개 키/비밀 키 쌍 을 사용 합 니 다)보 낸 사람 이 그들 이 말 한 사람 인지 확인 할 수 있 습 니 다.또한 서명 은 헤더 와 유효 부하 계산 을 사용 하기 때문에 내용 이 변경 되 지 않 았 는 지 확인 할 수 있 습 니 다.
  • JWT 구조 가 뭐 예요?
    JSON Web 토 큰 은 치밀 한 형식 으로 세 부분 으로 구성 되 는데 이 부분 들 은 점(.)으로 나 뉘 는데 각각 다음 과 같다.
  • 헤더
  • 유효 하중
  • 서명

  • 따라서 JWT 는 통상 다음 과 같다.
    xxxxx.yyyyy.zzzzz
    헤더:보통 두 부분 으로 구성 되 어 있 으 며 토 큰 형식 과 사용 하 는 서명 알고리즘 입 니 다.
    
    {
     "alg": "HS256",
     "typ": "JWT"
    }
    
    유효 부하:세 가지 설명 유형 이 있 습 니 다.미리 정 의 된 성명,공공 성명 과 개인 성명 이 있 습 니 다.성명 이름 은 단지 세 글자 에 불과 하 다.왜냐하면 JWT 는 치밀 하기 때문이다.
  • 미리 정 의 된 성명:iss(발송 자),exp(만 료 시간),sub(주제),aud(시청자)등 을 포함 하여 추천 하지만 강제 적 인 것 은 아 닙 니 다.
  • 공공 성명:공공 성명,이 부분 은 마음대로 정의 할 수 있 지만 IANA JSON Web Token 과 충돌 하 는 것 에 주의해 야 합 니 다.
  • 개인 성명:이 부분 은 인 정 된 정 보 를 공유 하 는 사용자 정의 부분 입 니 다.
  • 서명:서명 부분 을 만 들 려 면 인 코딩 된 헤더,인 코딩 의 유효 부하,기밀,헤더 에 지정 한 알고리즘 을 가 져 와 서명 해 야 합 니 다.
    예 를 들 어 HMAC SHA 256 알고리즘 을 사용 하려 면 다음 과 같은 방식 으로 서명 을 만 듭 니 다.
    
    HMACSHA256(
     base64UrlEncode(header) + "." +
     base64UrlEncode(payload),
     secret)
    
    서명 은 메 시 지 를 검증 하 는 데 사 용 됩 니 다.이 과정 에서 변경 되 지 않 았 고 비밀 키 를 사용 하여 서명 한 토 큰 에 대해 서 는 JWT 의 발송 자가 말 한 정체 임 을 검증 할 수 있 습 니 다.
    다음 과 같이 조합 하면 출력 은 점 으로 구 분 된 Base 64-URL 문자열 세 개 입 니 다.
    
    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
    eyJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjUyMDAiLCJhdWQiOlsiYXBpIiwiYXBpIl0sIkd1aWQiOiIzM2NhZmJkNS1jZWEyLTRjOWMtYWZlYS01MDYyZjM3YWUyOTAiLCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL3JvbGUiOlsic3lzdGVtIiwiYWRtaW4iXSwiZXhwIjoxNjA2NjU2NjI0fQ.
    JvDHuowbOnWiyxMIFc9gG5rw1LSSc0xx68L31oRfxS0
    
    어떻게 JWT 를 사용 합 니까?
    사용자 가 보 호 된 경로 나 자원 에 접근 하려 고 할 때마다 사용자 대 리 는 JWT 를 보 내야 합 니 다.보통 로 딩 모드 를 사용 하여 Authorization 헤더 에 JWT 를 보 냅 니 다.헤더 의 내용 은 다음 과 같다.
    
    Authorization: Bearer <token>
    
    어떤 상황 에서 이것 은 무상 태 권한 수여 메커니즘 일 수 있다.서버 의 보호 루트 는 Authorization 헤더 에서 유효한 JWT 를 검사 하고,존재 할 경우 보 호 된 자원 에 접근 할 수 있 도록 합 니 다.JWT 가 필요 한 데 이 터 를 포함 하고 있다 면 데이터베이스 의 일부 조작 에 대한 수 요 를 줄 일 수 있다.비록 이런 상황 이 항상 그렇지 는 않 지만.
    토 큰 이 Authorization 헤더 에서 보 낸 것 이 라면 도 메 인 간 자원 공유(CORS)는 쿠키 를 사용 하지 않 기 때문에 문제 가 되 지 않 습 니 다.
    다음 그림 은 JWT 를 가 져 와 API 나 자원 에 접근 하 는 방법 을 보 여 줍 니 다.
  • 응용 프로그램 이나 클 라 이언 트 가 권한 수여 서버 에 권한 을 요청 합 니 다.이것 은 서로 다른 권한 수여 절차 중 하 나 를 통 해 실 행 된 것 이다.예 를 들 어 전형 적 인OpenID Connect에 부합 되 는 웹 프로그램 은/oauth/authorize 를 사용권한 부여 코드 흐름점 을 통과 합 니 다.
  • 권한 수여 후 권한 수여 서버 는 방문 토 큰 을 응용 프로그램 에 되 돌려 줍 니 다.
  • 이 프로그램 은 보 호 된 자원(예 를 들 어 API)에 접근 하기 위해 액세스 토 큰 을 사용 합 니 다.
  • 서명 한 토 큰 을 사용 하면 토 큰 에 포 함 된 모든 정 보 는 사용자 나 다른 사람 에 게 노출 됩 니 다.변경 할 수 없 더 라 도.이것 은 귀하 가 기밀 정 보 를 영패 에 넣 어 서 는 안 된다 는 것 을 의미 합 니 다.
    .net core 의 JWT 인증 권한 부여
    .net core webapi 프로젝트 를 직접 만 듭 니 다.제 버 전 은 3.1 입 니 다.
    1.nuget 설치 먼저 사용:Microsoft.AspNetCore.Authentication.JwtBearer.버 전과.net core 버 전의 호 환 에 주의 하 십시오.net 5 는 5.0.0+버 전 을 지원 합 니 다.그렇지 않 으 면 사용 할 수 있 는 낮은 버 전 을 사용 하 십시오.
    2.apptsettings.json 프로필 에 우리 의 JWT 설정 인 자 를 다음 과 같이 쓰 십시오.
    
     "Jwt": {
     "Secret": "your-256-bit-secret",
     "Iss": "https://localhost:44355",
     "Aud": "api"
     }
    
    3.Startup.cs 의 Configure Services 방법 에 인증 을 다음 과 같이 추가 합 니 다.
    
    var jwtConfig = Configuration.GetSection("Jwt");
    //    
    var symmetricKeyAsBase64 = jwtConfig.GetValue<string>("Secret");
    var keyByteArray = Encoding.ASCII.GetBytes(symmetricKeyAsBase64);
    var signingKey = new SymmetricSecurityKey(keyByteArray);
    //    
    services.AddAuthentication("Bearer")
     .AddJwtBearer(o =>
     {
      o.TokenValidationParameters = new TokenValidationParameters
      {
       ValidateIssuerSigningKey = true,//      ,           ,   
       IssuerSigningKey = signingKey,//     
       ValidateIssuer = true,//       ,        Iss    ValidIssuer  
       ValidIssuer = jwtConfig.GetValue<string>("Iss"),//   
       ValidateAudience = true,//       ,        Aud    ValidAudience  
       ValidAudience = jwtConfig.GetValue<string>("Aud"),//   
       ValidateLifetime = true,//        ,        
       ClockSkew = TimeSpan.Zero,//         ,    ,           ,        ,    +  ,     7  ,        0
       RequireExpirationTime = true,
      };
     });
    Configure 방법 에 app.UseAuthentication()과 app.UseAuthorization()을 추가 합 니 다.위치 에 놓 을 위 치 를 주의 하 십시오.
    
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
     if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}
     app.UseHttpsRedirection();
     app.UseRouting();
     app.UseAuthentication();
     app.UseAuthorization();
     app.UseEndpoints(endpoints =>{ endpoints.MapControllers();});
    }
    4.jwt 토 큰 을 만 들 고 기본 으로 생 성 된 컨트롤 러 Weather ForecastController 에 토 큰 을 만 드 는 방법 을 추가 합 니 다.
    
    [HttpPost]
    public IActionResult Authenticate()
    {
     var jwtConfig = Configuration.GetSection("Jwt");
     //  ,    ,   Hmacsha256  ,  256bit   
     var securityKey = new SigningCredentials(new SymmetricSecurityKey(Encoding.ASCII.GetBytes(jwtConfig.GetValue<string>("Secret"))), SecurityAlgorithms.HmacSha256);
     //Claim,JwtRegisteredClaimNames              ,       Guid        .
     //ClaimTypes          role、email、name。Role      ,              
     //       
     var claims = new Claim[] {
        new Claim(JwtRegisteredClaimNames.Iss,jwtConfig.GetValue<string>("Iss")),
        new Claim(JwtRegisteredClaimNames.Aud,jwtConfig.GetValue<string>("Aud")),
        new Claim("Guid",Guid.NewGuid().ToString("D")),
        new Claim(ClaimTypes.Role,"system"),
        new Claim(ClaimTypes.Role,"admin"),
     };
     SecurityToken securityToken = new JwtSecurityToken(
      signingCredentials: securityKey,
      expires: DateTime.Now.AddMinutes(2),//    
      claims: claims
     );
     //  jwt  
     return Content(new JwtSecurityTokenHandler().WriteToken(securityToken));
    }
    5.jwt 를 사용 하여 인터페이스의 접근 을 제어 합 니 다.우 리 는 하나의 인터페이스 에 하나의 특성 을 추가 합 니 다.[Authorize(Roles="admin")]는 admin 이라는 캐릭터 의 jwt 토 큰 이 있어 야 접근 할 수 있다 는 뜻 입 니 다.roles 인자 가 없 으 면 사용 가능 한 토 큰 이면 접근 할 수 있 고 여러 개의 role 캐릭터 가 여러 가지 특성 을 중첩 할 수 있 습 니 다.
    
    [HttpGet]
    [Authorize(Roles = "admin")]
    [Authorize(Roles = "system")]
    public IEnumerable<WeatherForecast> Get()
    {
     var rng = new Random();
     return Enumerable.Range(1, 5).Select(index => new WeatherForecast
     {
      Date = DateTime.Now.AddDays(index),
      TemperatureC = rng.Next(-20, 55),
      Summary = Summaries[rng.Next(Summaries.Length)]
     })
     .ToArray();
    }
    6.테스트 를 한 후에 우 리 는 postman 으로 테스트 할 수 있 습 니 다.매우 성공 적 이 고 데이터 가 있 는 것 을 볼 수 있 습 니 다.
     

    진급 하 다
    인증 할 때 이 벤트 를 추가 할 수 있 습 니 다.예 를 들 어 아래 인증 실패 이벤트,수신 매개 변수 이 벤트 는 http 요청 헤더 의 Authorization 이 아 닌 url 의 인 자 를 토 큰 으로 가 져 올 수 있 습 니 다.
    
    services.AddAuthentication("Bearer")
     .AddJwtBearer(o =>
     {
      o.Events = new JwtBearerEvents()
      {
       OnMessageReceived = context =>
       {
        context.Token = context.Request.Query["access_token"];
        return Task.CompletedTask;
       },
       OnAuthenticationFailed = context =>
       {
        //     ,  <    >   ,      
        if (context.Exception.GetType() == typeof(SecurityTokenExpiredException))
        {
         context.Response.Headers.Add("Token-Expired", "true");
        }
        return Task.CompletedTask;
       }
      };
     });
    총결산
    여기 서.Net Core 공식 JWT 권한 수여 검증 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 이 있 습 니 다.Net Core 공식 JWT 권한 수여 검증 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기