C\#jwt 기반 분포 식 로그 인
서버 에 사용자 로그 인 정 보 를 저장 합 니 다.이 로그 인 정 보 는 응답 할 때 브 라 우 저 에 전달 되 고 쿠키 로 저장 되 어 다음 요청 시 우리 에 게 보 내 는 응용 프로그램 을 알려 줍 니 다.그러면 우리 의 응용 프로그램 은 요청 이 어느 사용자 에서 왔 는 지 식별 할 수 있 습 니 다.이것 이 바로 전통 적 인 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
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\#분포 식 로그 인 을 실현 하 는 데 관 한 자 료 는 저희 의 다른 관련 글 을 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#Task를 사용하여 비동기식 작업을 수행하는 방법라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다). 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.