[백업][가리사니] spring security oauth 통합 로그인 : 4. 추가사항
java, spring

이 문서는 가리사니 개발자 포럼에 올렸던 글의 백업 파일입니다. 오래된 문서가 많아 현재 상황과 맞지 않을 수 있습니다.

Spring Security OAuth 통합 로그인 시리즈

서론

이중 로그인 방지 신기하게도 스프링에서는 로그인 상태에서 재인증이 가능합니다. 즉, abc 라는 id 로 로그인 한 상태이지만, 해당 상태로 def 라는 id로 로그인이 가능합니다. 이 때 스프링 사이클에서는 로그아웃을 부르지 않습니다.

  • 즉 abc때 기록해둔 세션들이 def에 남아있을 수 있습니다.
  • Authentication 외 다른 곳에 세션을 생성하지 않음으로써 어느정도 위험은 줄어들지만 근본적으로 이중 로그인을 막는 것이 맞다고 생각합니다. 불행하게도 필자는 스프링 사이클에 모든 auth에 관련되 미리실행되는 필터를 찾지 못 했습니다.

때문에 OAuth와 일반 인증 둘을 체크하기위해 별도의 필터를 만들었습니다.

  • 필자는 리다이렉트보다 없는 페이지로 보여주는 것을 선호하기 때문에 404를 보냈습니다.
  • 방법은 각자 고민해보시기 바랍니다.
    public static class DuplicateAuthenticationFilter implements Filter
    {
      final String prefixUrl;
    
      public DuplicateAuthenticationFilter(String prefixUrl)
      {
          this.prefixUrl = prefixUrl;
      }
    
      @Override
      public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
              throws IOException, ServletException
      {
          if ( ((HttpServletRequest)req).getServletPath().startsWith(prefixUrl) )
          {
              Authentication auth = SecurityContextHolder.getContext().getAuthentication();
    
              // 룰을 하나라도 가지고 있다면 로그인으로 간주
              if (auth != null && !auth.getAuthorities().isEmpty())
              {
                  // 404 를 보내준다.
                  ((HttpServletResponse)res).sendError(404);
                  return;
              }
          }
          chain.doFilter(req, res);
      }
    
      @Override
      public void init(FilterConfig filterConfig) throws ServletException
      {
      }
    
      @Override
      public void destroy()
      {
      }
    }
    

    적용

  • 필자는 모든 url을 /sign-in 밑으로 넣었습니다.
  • 예를들어 /sign-in (일반), /sign-in/facebook (페이스북), /sign-in/naver (네이버)
    @Override
    protected void configure(HttpSecurity http) throws Exception
    {
      http
          // 각종 설정 생략
          .addFilterBefore(new DuplicateAuthenticationFilter("/sign-in"), BasicAuthenticationFilter.class);
    }