TIL(Web)-2020.12.22~12.23(Session)
오늘은 사용자의 인증 및 권한을 위한 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 매핑을 깔끔하게 잘 해야한다.... 안그럼 예외적인 상황이 너무 많이 생긴다.
}
}
오늘은 여기까지 학습하였습니다!
Author And Source
이 문제에 관하여(TIL(Web)-2020.12.22~12.23(Session)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@junjun-creator/TILWeb-2020.12.22Session저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)