C\#jwt 기반 분포 식 로그 인

1.전통 적 인 session 로그 인
서버 에 사용자 로그 인 정 보 를 저장 합 니 다.이 로그 인 정 보 는 응답 할 때 브 라 우 저 에 전달 되 고 쿠키 로 저장 되 어 다음 요청 시 우리 에 게 보 내 는 응용 프로그램 을 알려 줍 니 다.그러면 우리 의 응용 프로그램 은 요청 이 어느 사용자 에서 왔 는 지 식별 할 수 있 습 니 다.이것 이 바로 전통 적 인 session 기반 인증 입 니 다.

asp.net core 에서 간단하게 실현 할 수 있 습 니 다:

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
  public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  {
   if (env.IsDevelopment())
   {
    app.UseDeveloperExceptionPage();
   }
   else
   {
    app.UseExceptionHandler("/Home/Error");
    app.UseHsts();
   }

   app.UseHttpsRedirection();
   //      
   app.UseStaticFiles();
   //Cookie  
   //app.UseCookiePolicy();
   //Session
   app.UseSession();

   app.UseMvc(routes =>
   {
    routes.MapRoute(
     name: "default",
     // template: "{controller=Home}/{action=Index}/{id?}");
     //template: "{controller=Home}/{action=Server}/{id?}");
     template: "{controller=Login}/{action=SignIn}/{id?}");
   });
  }
그러나 이러한 session 기반 인증 은 응용 자체 가 확장 되 기 어렵 고 서로 다른 클 라 이언 트 사용자 가 증가 함 에 따라 독립 된 서버 는 더 많은 사용 자 를 불 러 올 수 없 으 며 이 럴 때 session 인증 응용 을 바탕 으로 하 는 문제 가 드 러 날 것 이다.
전통 session 의 주요 문 제 는 다음 과 같다.
1.서버 압력:모든 사용자 가 우리 의 응용 인증 을 거 친 후에 우리 의 응용 프로그램 은 서버 에서 한 번 기록 하여 사용자 가 다음 에 요청 한 감별 을 편리 하 게 해 야 합 니 다.일반적으로 session 은 메모리 에 저장 되 고 인증 사용자 가 증가 함 에 따라 서버 의 비용 이 현저히 증가 합 니 다.
2.확장 성:사용자 인증 후 서버 에서 인증 기록 을 합 니 다.인증 기록 이 메모리 에 저장 되면 사용자 가 다음 요청 을 할 때 이 서버 에 요청 해 야 권한 을 수 여 받 을 수 있 는 자원 을 얻 을 수 있 습 니 다.이렇게 분포 식 응용 에 있어 부하 이퀄 라이저 의 능력 을 제한 합 니 다.이것 또한 응용의 확장 능력 을 제한 했다 는 것 을 의미한다.
3.CSRF:쿠키 를 기반 으로 사용 자 를 식별 하기 때문에 쿠키 가 캡 처 되면 사용 자 는 크로스 오 버 사이트 에서 위 조 를 요청 하 는 공격 을 받 기 쉽다.
2.token 기반 의 감 권 체제
token 기반 의 감 권 체 제 는 무상 태 입 니 다.서버 에서 사용자 의 인증 정보 나 세 션 정 보 를 보류 하지 않 고 token 을 바탕 으로 연산 하여 감 권 을 실현 합 니 다.이 는 token 인증 체 제 를 바탕 으로 하 는 응용 은 사용자 가 어느 서버 에 로그 인 했 는 지 고려 할 필요 가 없다 는 것 을 의미한다.이것 은 서비스 가 대규모 분포 식 을 실현 하 는 데 기반 을 다 져 주 었 다.

위의 그림 은 token 으로 로그 인 하 는 실현 방식 으로 유사 한 것 도 많다.분포 식 로그 인 처 리 를 실 현 했 지만 서로 다른 시스템 간 의 실현 으로 인해 개 발 량 이 급증 했다.
제 이 슨 웹 토 큰
여 기 는 JWT―Json web token(홈 페이지 링크)을 추천 합 니 다.전형 적 인 JWT 는 다음 과 같이 보인다.

jwt 는 하나의 문자열 로 문자 간 에'.'구분자 로 세 개의 문자열 로 나 뉜 다.JWT 대상 이 긴 문자열 이 고 각 문자열 사이 에 줄 바 꿈 문자 가 없 음 을 주의 하 십시오.이 곳 은 필요 한 것 을 보 여주 기 위해 줄 을 나 누 어 다른 색 으로 표시 합 니 다.모든 하위 문자열 은 하나의 기능 블록 을 표시 합 니 다.모두 다음 과 같은 세 가지 부분 이 있 습 니 다.JWT 헤드,유효 부하 와 서명 은 다음 과 같이 한 줄 로 작성 합 니 다.

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InRlc3QiLCJpYXQiOjE1OTM5NTU5NDMsInVpZCI6MTAsImV4cCI6MTU5Mzk1NTk3Mywic2NvcGVzIjpbImFkbWluIiwidXNlciJdfQ.VHpxmxKVKpsn2Iytqc_6Z1U1NtiX3EgVki4PmA-J3Pg 
보통 HTTP 에서 요청 한 Header Authorization 필드 에 넣 습 니 다.

Authorization: Bearer
여 기 는 nuget:https://www.nuget.org/packages/JWT.Standard/또는 vs 에서 사용 할 수 있 습 니 다.

jwt.standard 를 입력 하여 nuget 패 키 지 를 찾 아 다운로드 하 십시오.
1.jwt 데이터 생 성
사용 할 곳 에 다음 C\#코드 를 입력 하 십시오:

var jwtp = new JWTPackage<UserModel>(new UserModel()
{
 Id = "1",
 Name = "yswenli",
 Role = "Admin"
}, 180, _pwd);
var keyValuePair = jwtp.GetAuthorizationBearer();
context.HttpContext.Response.Headers[keyValuePair.Key] = keyValuePair.Value;
이렇게 하면 필요 한 jwt 내용 정 보 를 Http 머리 에 넣 을 수 있 습 니 다.물론 다음 과 같은 방식 으로 매개 변수 데이터 로 전달 하여 도 메 인 문 제 를 피 할 수 있 습 니 다.

var password = Guid.NewGuid().ToString("N");

 var jwtp1 = new JWTPackage<User>(new User()
 {
  Id = "1",
  Name = "yswenli",
  Role = "Admin"
 }, 180, password);

 var sign = jwtp1.Signature;
2.jwt 분석 검증
JWTPackage에서 JWTPackage.Parse 방법 으로 jwt 의 내용 을 해석 하고 내용 이 header 의 매개 변수 라면 인증 코드 를 다음 과 같이 빠르게 해석 합 니 다.

var result = string.Empty;
try
{
 if (context.HttpContext.Request.Headers.ContainsKey(keyValuePair.Key))
 {
  var val = context.HttpContext.Request.Headers[keyValuePair.Key].ToString();

  val = val.Replace(JWTPackage.Prex, "");

  var jwt = JWTPackage<UserModel>.Parse(val, pwd);

  result = "OK";
 }
}
catch (IllegalTokenException iex)
{
 result = $"    :{iex.Message}";
}
catch (TokenExpiredException tex)
{
 result = $"    :{tex.Message}";
}
catch (SignatureVerificationException sex)
{
 result = $"    :{sex.Message}";
}
catch (Exception ex)
{
 result = $"    :{ex.Message}";
}
return result;
질문
위 와 같은 간단 한 소 개 를 통 해 JWT 는 인증 뿐만 아니 라 정보 교환 에 도 사용 할 수 있 으 며,JWT 를 잘 활용 하면 서버 가 데 이 터 를 요청 하 는 횟수 를 줄 이 는 데 도움 이 된다.그러나 JWT 를 정확하게 사용 하지 않 으 면 안전 문제 가 발생 할 수 있다.주요 몇 가 지 는 다음 과 같다.
1.시 크 릿 키 를 잘 보호 하고 암호 화 된 비밀 번 호 를 누설 하면 안 됩 니 다.그렇지 않 으 면 서명 의 의 미 를 잃 게 됩 니 다.
2.Replay Attacks,JWT 메시지 체 에 생 성 시간 을 넣 어 백 엔 드 에서 시간 판정 을 하고 정 해진 시간 보다 적은 직접 차단 을 하 는 것 이 좋다
3.JWT 의 payload 부분 에 민감 한 정 보 를 저장 해 서 는 안 됩 니 다.이 부분 은 클 라 이언 트 가 복호화 할 수 있 는 부분 이기 때 문 입 니 다.
4.권장 하 는 방식 은 SSL 암호 화 전송(https 프로 토 콜)을 통 해 민감 한 정보 가 탐지 되 지 않도록 하 는 것 이다.
이상 은 C\#jwt 를 바탕 으로 분포 식 로그 인 을 실현 하 는 상세 한 내용 입 니 다.c\#분포 식 로그 인 을 실현 하 는 데 관 한 자 료 는 저희 의 다른 관련 글 을 주목 하 십시오!

좋은 웹페이지 즐겨찾기