Httpcontext 의 질문입니다.

뭔가 평범하지 않은것을 만드니 힘드네요

HTTP Context 의 대해서 질문입니다.

httpcontext 는 HTTP 요청 및 응답에 대한 모든 정보를 캡슐화 한것입니다.

이걸 그동안 대충 알았는데 디테일하게 뜯어볼려니 힘드네요 ; 기초가 약했던것 후회합니다.

그래서 이 httpcontext client 가 server 에 접근하면 하나의 instance 가 생겨서
일종의 채널 개념으로 이해해야 할까요?? 이 개념에 대해서 좀 쉽게 설명된 아티클 같은것 소개해주시면 감사하겠습니다.
ㅠㅠ

그리고 api 에 middleware를 하나 만들었습니다.
여기서 들어오는 특정 path에

public async Task InvokeAsync(HttpContext httpContext, RequestDelegate next)
{
      string checkpath = "check.file";
       var requestpath = httpContext.Request.Path.ToString().ToLower();
	if ( requestpath.IndexOf(checkpath)>-1)
	{
			var claim = new Claim(ClaimTypes.Name,"bluebird");
			var identity = new ClaimsIdentity(new[] { claim }, "BasicAuthentication"); // this uses basic auth
			var principal = new ClaimsPrincipal(identity);
			httpContext.User = principal;
     }

이렇게 if ( requestpath.IndexOf(checkpath)>-1) 특정 path 로 요청이 들어오며
httpcontext.user 객체에 정의된 claim 을
httpContext.User = principal; 이렇게 넣어준다고 할때 해당 client 요청은
요청할때 httpcontext.user 가 넣어준 claim 계속 가지고 요청을 하게 될까요??
이런 개념이 맞는지 질문 드립니다.

아니며 특정 요청 client 를 특정하는 tag개념이나 flag 를 하는 방법이 있을까요?

1 Like

http는 stateless하므로 한번의 요청과 응답시 웹브라우저와 서버사이의 오고가는 context로 이해하고 있습니다.

아래내용은 cookie기준입니다. 클레임을 어떻게 처리하시는지는 모르겠지만, 가능하리라 생각합니다.

저같은 경우 간단한 부분 및 인증등은 cookie로 처리합니다.
웹브라우저의 cookie는 만료되지 않았을때 cookie 도메인 등 맞을때 요청시 마다 cookie가 서버로 전송됩니다.

수동으로 cookie를 만들어 응답시 내려주면 해당 cookie는 만료전까지 계속 전송되므로 가능할 것 같습니다. 그리고, cookie 내용은 암호화해서 내려주시고 요청시 들어온 cookie는 미들웨어에서 검증하시면 될 것 같습니다.

서버경로별 cookie저장도 되므로 확인해보시기 바랍니다.
경로가 설정된 경우 경로가 일치하는 경우에만 쿠키를 전송합니다.

수동으로 생성시에도 보안을 위해 httponly, secure, samesite등 설정하시면 좋을듯합니다.

3 Likes

대체적으로 맞지만, User와 관련해서는 인증이 결부된 것입니다.
인증은 암호화(시크릿)와 관련이 있습니다.

그렇지 않을 것입니다.

HttpContext.User를 관리하는 주체는 "인증 미들웨어"입니다.

사용자가 제공한 로그인 정보 (혹은 외부 인증 정보) 가 유효한 경우, 우리는 “로그인 중” 임을 나타내는 정보를 응답에 포함시켜, 클라이언트로 하여금 이를 저장하게 만들어야 합니다.

이러한 과정은 아래와 같이 응답이 나가는 방향 어디에선가 이뤄지는데,

client … <= 인증미들웨어 <= 미들웨어1 <= 미들웨어 2 <= … <= 요청핸들러.

유저 정보를 암호화하여 응답에 실어주는 역할을 하는 것이 SignInManager 객체입니다.

SignInManger.SignIn 메서드는 사용자 정보를 암호화하여, 시크릿을 생성하고, 이를 응답에 포함시킵니다.

이때, 시크릿이 포함될 위치와 형태는 인증 스킴(AuthenticationScheme)이 결정합니다. - 쿠키 인증이면 쿠키로, 무기명 토큰(Bearer token) 인증이면 토큰으로.

응답을 통해 시크릿을 받은 클라이언트는 그 시크릿을 매 요청 마다 포함시키게 됩니다.

client => request => 인증미들웨어 => 미들웨어1 => 미들웨어 2 => … => 요청핸들러.

인증 미들웨어는 request에 시크릿이 포함되어 있다면, 이를 해독하여 HttpContext.User에 할당하는 과정을 수행합니다. (매 요청 마다 반복됩니다)

물론, 이 때도 인증 스킴에 의해서 어디에 있는 어떤 시크릿을 사용할 지 선택하게 됩니다.

특정 미들웨어가 이 값을 조작하면, 그 뒷 단에 있는 미들웨어(예제 코드의 미들웨어 포함)와 요청 핸들러(액션 메서드, 페이지의 메서드)에만 변경된 값이 유효할 것입니다.

응답이 나갈 때 SignInManger가 SignIn 시켜 주지 않는 한, 클라이언트는 자신이 저장하고 있는 시크릿을 다시 보내기 때문에, 새로운 요청에서는 변경 전의 값만 계속 들어오게 됩니다.

1 Like

감사합니다.

와 이걸 인증 프로세스를 다 이해 하셨군요 ㄷㄷㄷ
와 이제야 이해가 갑니다 와 이것 어디서 이렇게 정리된곳도 없을텐데
대단하세요

2 Likes