-
사용자 Session을 처리하는 방법프로그래밍 2024. 10. 24. 12:18
우리가 흔히 개발을 할 때 사용자 인증과 정보를 처리하기 위해서 Session을 사용하게 된다.
즉, 사용자가 접속한 정보 및 인증, 개인정보 등의 집합체를 Session으로 정의할 수 있다.
흔히 MVC라면 cookie 또는 서버측 Session을 이용할 것이다.
SPA라면 JWT를 사용할 것이다.
JWT는 cookie로도 사용할 수 있다.
조금 색다른 방법을 알아보고자 한다.
MVC의 경우인데, Url query에 session key를 넣어서 사용하는 것이다.
예로 아래와 같다.
https://test.demo.com?session=b4F8d2E7c1A6g7H9i4L2m9P0x5T7r8Q6
과 같이 구성하는 것이다.
따라서 이후 url query는 session을 포함한 url이 되게 된다. 예는 아래와 같다.
https://test.demo.com/home/get?pageno=1&pagesize=10&session=b4F8d2E7c1A6g7H9i4L2m9P0x5T7r8Q6 https://test.demo.com/home/post?session=b4F8d2E7c1A6g7H9i4L2m9P0x5T7r8Q6
물론 session에 해당 하는 내역을 브라우저 session storage 또는 local storage에 저장해도 되지만, 위 방법의 장점은 테스트에 있다.
session 키를 url에 넣으므로써 테스트나 사용자 오류시에 그 상태를 알기위한 접속을 즉각적으로 확인 할 수 있기 때문이다.
또한 브라우저 상에서는 완전 휘발성이므로 안전한 관리 방법일 수 있겠다.
특히 local storage에 저장할 경우 위험성이 크므로 local storage에 session을 저장하는 것은 지향하는 것이 좋겠다.
SPA같은 경우 session storage를 사용할 것이다.
이 방법을 사용하는 MVC 또는 WEB API 경우 session filter가 있어야 하는데 request가 서버측으로 넘어올 때 session key를 사용해서 db 또는 redis를 이용하여 조회하면 되겠다.
예제 코드는 아래와 같다.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.Method)] public class SessionAttribute : Attribute, IFilterFactory { private readonly string _setParameterName; public SessionAttribute(string setParameterName) { _setParameterName = setParameterName; } public IFilterMetadata CreateInstance(IServiceProvider serviceProvider) { return new SessionSetup(_setParameterName); } public bool IsReusable => false; private class SessionSetup : IAsyncActionFilter { private readonly string _setParameterName; public SessionSetup(string setParameterName) { _setParameterName = setParameterName; } public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { var session = context.RouteData.Values["session"] as string; var requestBaseModel = context.ActionArguments[_setParameterName] as RqModelBase; if (session.xIsNotEmpty() && requestBaseModel.xIsNotEmpty()) { // Modify the request object or perform any necessary actions requestBaseModel.Session = //... select user infomation } await next(); } } }
위 예제는 attribute로 처리한 코드이지만 Filter로 처리하거나 Middleware로 처리할 수도 있겠다.
도움이 되기를 바라며...
'프로그래밍' 카테고리의 다른 글
Kafka Consumer를 조금 더 효율적으로 처리하는 방법 (0) 2024.11.13 시계열 데이터를 전송하는 방법 (0) 2024.10.25 GUID대신 ULID를 사용해 보자. (2) 2024.10.23 AntdUI 소개 (1) 2024.10.22 리소스 관리 전략 (0) 2024.10.22