TIL(Web)-2020.12.22~12.23(Session)

3236 단어 TIL(Web)TIL(Web)

오늘은 사용자의 인증 및 권한을 위한 Session을 배워보았습니다.

Today I Learned

  • Session

Session

  • 어원 : 특정 기간(어떤 주제를 다루는 기간)
  • 즉, 사용자가 서비스를 이용하는 시간

그렇다면, 어떻게 사용자를 구분하고, 사용자가 이용한 시간을 알 수 있을까?

  • WAS
    • 세션정보를 관리함
    • 처음 요청시에 SID를 발급하고 사용자를 위한 공간을 만듬
    • 사용자는 세션정보를 requestHeader에 담아서 요청을 보낸다.(처음 접속한 사람은 세션정보가 없음)
    • 이러한 세션 정보는 브라우저가 가지고 있으면서 요청시 전송을 함
    • 브라우저가 닫히면 세션정보도 함께 사라진다.
    • 서버에서는 부여한 세션정보를 모두 다 가지고 있을 수 없다.
      • 유효기간을 두고, 다시 요청이 없으면 세션을 초기화 시킨다(sessionTimeout)
      • tomcat server에 web.xml에 기본설정이 되어있고, 각 app별로 설정을 위해서는 각 app내의 web.xml에 오버라이드 하여 설정하면 된다.
    • session 생성 시점
      • 세션이 사용되는 시점에 생성됨
      • 세션 공간을 사용하는 시점에 사용자를 식별하기 위한 아이디를 발급함. (사용자를 식별할 필요가 없을때에는 발급하지 않음)
      • jsp를 요청하는경우, jsp가 컴파일 되면서 내장객체가 생성되는데, 내장객체에 세션이 있어서 세션 아이디가 발급됨

서버가 사용자를 식별하는 방법

  • 상태저장
    • 웹은 연결이 끊어지는 상태에서 서비스를 해야한다.
    • 전역변수처럼 매번 호출이 될때마다 사용할 수 있는 저장소를 활용한다.
  • 저장소에 저장된 정보를 활용하여 인증, 권한을 부여할 수 있다.

인증 후

  • 로그인 후에는 어디로 보낼것인가?
    • 메인화면에서 다이렉트로 로그인 한 경우, 메인화면으로 redirect해주면 된다.
    • 하지만 다른 위치에서 인증에 문제가 생겨 로그인을 하는경우? 기존 위치로 다시 돌아가야한다.
      • 이전 페이지 컨트롤러에서 return 설정을 해주어야 한다.
      • response.sendRedirect("/signin?return-url=/user/userInfo/memberInfo");
      • 하지만 이렇게 전송시, get방식으로 전송하므로, 로그인 하는 post에서는 사용이 불가하다
      • 히든 필드를 사용하여 이를 해결한다.

인증 필터링

  • 모든 서블릿에서 써야하는 인증코드를 모아서 필터로 만든다.
  • doFilter를 기준으로 사전 사후처리를 한다.
  • 인증필터는 사전처리를 해야한다.
  @WebFilter("/*")
public class TeumSecurityFilter implements Filter{
	private final static String[] authURLs = {
			"/user/","/company/","/admin/"
	};
	
	private final static String[] authUser = {
			"/company/","/admin/"
	};
	private final static String[] authCompany = {
			"/user/","/admin/"
	};
	private final static String[] authAdmin = {
			"/user/","/company/"
	};

	@Override
	public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
			throws IOException, ServletException {
		HttpServletRequest request = ((HttpServletRequest) req);
		HttpServletResponse response = ((HttpServletResponse)resp);
		
		String uri = request.getRequestURI();
		// TODO Auto-generated method stub
		HttpSession session = request.getSession();
		
		
		boolean requireAuth = false;
		for(String url : authURLs) {
			if(uri.contains(url)) {
				requireAuth = true;
				break;
			}
		}
		//인증이 필요한데 인증이 되어있지 않다
		if(session.getAttribute("email")==null && requireAuth) {
			
			response.sendRedirect("/signin?return-url="+uri);
			return;
		}
		
		// 모든 페이지에 대해 로그인 여부 검사를 마침.
		// 이제 각 로그인 타입별로 필터링 해줘야함
		int type = (int)session.getAttribute("type");
		
		if(type == 0) {
			boolean authByUser = false;
			for(String url : authUser) {
				if(uri.contains(s))
			}
		}
		
		
		chain.doFilter(request,response);
		
		//테스트 완료.
		//필터 설정을 위해서는 url 매핑을 깔끔하게 잘 해야한다.... 안그럼 예외적인 상황이 너무 많이 생긴다.
	}

}

 

오늘은 여기까지 학습하였습니다!

좋은 웹페이지 즐겨찾기