널님은 안녕하지 못하다.

널님은 안녕하지 못하다.

쇼핑몰 프로젝트 51일 차.

쇼핑몰 정책상 로그인을 하지 않은 사용자는 마이페이지에 들어갈 수 없도록 구현해서 로그인을 하지 않은채 상단 헤더의 Account버튼을 클릭한 사용자는 로그인페이지로 이동하게 구현했다.

하지만 서버를 구현하다가 헤더의 Account 버튼을 클릭하지 않고 바로 주소검색창에 URL을 입력한다면 어떻게 될지 의문이 생겨 실험을 한 결과 위와 같은 화면을 만날 수 있었다.

왜 이런 문제가 발생했을까?

원인을 찾아보니 비회원 구매를 구현할 때 Interceptor에서 Authorization 헤더가 없을 경우 Username = Guest를 생성해서 RequestAttribute에 세팅해준 것이 문제였다.

그럼 이 문제는 어떻게 해결해야 할까? 처음 떠오른 해결법은 아래와 같다.

회원이 아닌 사용자는 마이페이지에 접속할 수 없다. 라는 규칙은 서비스의 규칙이니 Service layer에서 Username을 통해 User를 찾고 만약 User의 Role이 Guest라면 에러를 발생시켜 에러핸들링을 통해 403 Forbidden을 응답코드로 보내주고 클라이언트에서 Redirect 시킨다.

Untitled

위 로직으로 충분히 해결할 수 있긴한데 만약 Authorization 헤더가 비어있는 상황이라면?

굳이 Service layer까지 들어가야 할까? 라는 고민이 생겼다. 결국 다루는 것은 인증과 인가에 대한 문제이고 이를 다루기 위해 AuthenticationInterceptor 클래스를 만들지 않았었나? 생각해보니 AuthenticationInterceptor에서 충분히 해결할 수 있는 문제였다.

//AuthenticationInterceptor.class

if (authorization == null || !authorization.startsWith("Bearer ")) {
            if (Objects.equals(request.getRequestURI(), "/orders/me")) {
                response.setStatus(HttpServletResponse.SC_FORBIDDEN);

                return false;
            }
}

친절한 300대의 Redirect 시리즈 보다는 아주 강력한 403 Forbidden이 마음에 들어 403을 사용.

그런데 Axios에서 status를 받지 못 하는 상황이 발생했다.