Azure 로그인.

안녕하세요.

Azure 인증된 사람이면 저희 회원 DB 정보를 조회해서 세션에 데이터를 저장합니다.
근데 간헐적으로 아래와 같이, 로컬 스토리지에 데이터가 많이 쌓여서 400 (Bad Request - Request Too Long) 에러가 발생합니다.
정확한 오류가 무엇인지 몰라 이렇게 문의 드려봅니다.ㅠㅠ

참고로, 일반적으로 로그인할때에는 문제가 없다가
세션이 없어져서 다시 로그인할때가 문제지 않을까 싶습니다.

화면 캡처 2022-10-31 120704

2개의 좋아요

뭔가 웹 요청할때마다 세션 관련 정보들이 추가 적재되는 느낌이네요.
세션 생성 이후에 웹 스토리지 변화를 확인해보시겠어요?

2개의 좋아요

정상적으로 세션이 생길때 웹 스토리지를 봐보면 될까요?
저 상황이 지금, 간헐적으로 세션이 끊겼을때 다시 AD 인증(Azure) 이후에 발생하는거 같습니다.

2개의 좋아요

동일한 이슈에 대한 질문이 stackoverflow에 있는 것 같아 공유 드려요.

간단히 정리하면,

  1. azure ad oauth2 쿠키가 만료됩니다.
  2. login.microsoft.com으로 갔다오면서 만료된 쿠키가 갱신합니다. 이때 nonce 쿠키가 새로 추가 됩니다.
  3. ajax는 cross domain 정책으로 다른 도메인(microsoft.com)를 제대로 접근하지 못하지만, nonce 쿠키는 이미 페이지에 추가 됩니다.
  4. 동일 현상이 반복 되고, nonce 쿠키는 빠르게 증가 합니다.

해결책
OWIN OpenId 프레임워크의 처리를 확장해서 ajax 처리를 다르게 적용하여 redirect와 함께 신규 쿠키를 보내는 일을 막습니다.

public void ConfigureAuth(IAppBuilder app)
{
    app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
    app.UseCookieAuthentication(new CookieAuthenticationOptions());

    app.UseOpenIdConnectAuthentication(
        new OpenIdConnectAuthenticationOptions
        {
            ClientId = clientId,
            Authority = authority,
            Notifications = new OpenIdConnectAuthenticationNotifications
            {
                RedirectToIdentityProvider = ctx => 
                {
                    bool isAjaxRequest = (ctx.Request.Headers != null && ctx.Request.Headers["X-Requested-With"] == "XMLHttpRequest");

                    if (isAjaxRequest)
                    {
                        ctx.Response.Headers.Remove("Set-Cookie");
                        ctx.State = NotificationResultState.HandledResponse;
                    }

                    return Task.FromResult(0);
                }
            }
        });
}

의견
stackoverflow의 글을 있는 그대로 적어봤습니다. 오역이 있더라도 양해 부탁 드립니다.
내용만 봐서는 세션 만료 됐을 때 세션 쿠키가 갱신 되는데, 크로스 도메인 정책으로 정상적인 후속 처리가 이뤄지지 않않아 스토리지에 쿠키가 누적 적재 되는 이슈로 보입니다.
이를 회피하기 위해서 세션 만료로 쿠키 갱신할 때 쿠키를 갱신하지 않고 401을 발생시켜서 ajax가 페이지 전체를 갱신시키는 방식으로 정상 처리 되도록 유도하는 코드로 보입니다.
이 코드로 해결되지 않을 수 있습니다. 하지만 아마도 원인은 stackoverflow의 것과 동일해보여서 다른 해결책들을 찾아 차근차근 대응해봐야 되겠네요.

참고

3개의 좋아요

정말 고맙습니다.
테스트 해보고 정보 공유하겠습니다!

3개의 좋아요

하나만 더 질문해보겠습니다.

사실 저희 사이트가, ajax를 이용한 비동기 통신을 많이 사용하고 있습니다.

해당 오류가 발생하는 것도, 오랫동안 사용안하다가 페이지 리로드가 되지 않은 상태에서
버튼이나 다른 액션 시 ajax를 이용하여 비동기 통신이 발생할때
정확히는 모르겠지만 이 때, login.microsoft.com 에 갔따오는거 같습니다.

그럼 저는 ajax를 이용한 비동기 통신 이전에,
쿠키/세션 값이 있는지 없는지 판단해서 없으면, 401 에러를 발생하여 페이지를 리로드 시켜야 하는건가요?

2개의 좋아요

쿠키가 없는 상태를 체크 하는 것이 아닌 만료된 쿠키를 이용하여 API를 호출할 때 프레임워크 수준에서 새로운 쿠키를 가져오는 노력을 중간에 낚아채서 401 오류를 발생시킨 다음 ajax 단에서 401를 받으면 화면을 전체 갱신하고 신규 쿠키를 가져와 크로스 도메인 이슈를 해결하는 방식입니다.
쿠키 상태를 체크 하는 사전 처리가 아니라 새로운 쿠키를 가져올 때의 사후 처리를 수정하는 해결책으로 보시면 되겠습니다.

3개의 좋아요

잘 이해는 안되지만, 이제는 제가 해결해야하는 문제인거 같습니다.

정성스러운 댓글 너무너무 고맙습니다.

3개의 좋아요