AOP에서 세션 체크하기
AOP는 "Aspect-Oriented Programming"의 약자로, 관심사를 분리하고 모듈화하기 위한 프로그래밍 기술입니다. AOP는 프로그램의 여러 부분에서 반복적으로 사용되는 코드를 중복없이 작성하고, 코드를 캡슐화하여 유지보수를 용이하게 합니다.
"session 검사"는 웹 애플리케이션에서 로그인한 사용자의 정보를 기록하고 관리하는 세션(Session)을 이용한 인증을 의미하는 것 같습니다. 세션을 이용한 인증을 구현할 때는 모든 요청에 대해 세션을 검사하여 인증된 사용자만이 접근할 수 있도록 해야 합니다.
이때 AOP를 이용하면, 세션 검사와 같은 인증 처리를 모든 컨트롤러 메소드에 일일히 적용하는 것이 아니라, 공통적으로 처리할 수 있습니다. 즉, AOP를 이용하면 세션 검사와 같은 인증 처리를 하나의 모듈로 분리하여 관리할 수 있습니다. 이를 통해 코드 중복을 줄이고 유지보수성을 향상시킬 수 있습니다.
세션 검사 제외
1. 로그인 전 단계 : member controller
보통 웹 어플리케이션에서 로그인 기능을 구현할 때, 사용자의 인증 정보를 세션(Session)에 저장합니다.
즉, 사용자가 로그인에 성공하면, 서버에서는 사용자의 정보를 세션에 저장하고, 해당 세션 ID를 쿠키에 담아 클라이언트에 전달합니다. 이후, 클라이언트는 이 쿠키를 이용하여 서버와의 통신 시 세션 ID를 전달하며, 서버는 이 세션 ID를 이용하여 세션 정보를 찾아서 사용자의 인증 정보를 확인합니다.
즉, "세션이 들어오는 부분은 로그인 한 다음"이라는 말은 사용자가 로그인에 성공하면, 세션에 해당 사용자의 정보가 저장되고, 이후 요청에서는 해당 세션 ID를 이용하여 서버와 통신하게 된다는 의미입니다. "로그인" 이후에는 클라이언트에서 세션 ID를 서버로 전달하는 과정이 필요하며, 이를 통해 서버는 해당 세션 ID에 대응하는 세션 정보를 찾아서 사용자의 인증 정보를 확인하게 됩니다.
따라서 컨트롤러를 검사하는 AOP가 있을 경우에는, 로그인 전에 해당하는 MemberController부분은 Controller에서 따로 빼서 관리해야 합니다. 로그인 후의 부분부터 세션 검사해야 하기 때문입니다.
2. 게시판 리스트 : bbslist.do controller
게시판 리스트 페이지에서 세션 검사를 하지 않는 이유는, 보통 게시판의 리스트 페이지는 로그인하지 않은 사용자도 볼 수 있는 페이지이기 때문입니다.
게시판은 대개 회원제 서비스에서 제공되며, 회원만이 글을 작성하거나 조회할 수 있습니다. 따라서, 회원이 로그인하지 않은 경우에는 게시판의 작성/조회 등의 기능이 제한되는 것이 일반적입니다. 하지만, 게시판의 리스트 페이지는 로그인하지 않은 사용자도 볼 수 있어야 합니다.
따라서, 게시판 리스트 페이지에서는 세션 검사를 하지 않습니다. 대신, 게시글을 작성하거나 수정/삭제하는 페이지에서는 세션 검사를 수행하여 로그인한 사용자만이 해당 기능을 사용할 수 있도록 구현합니다.
세션 체크 하는 부분
웹 애플리케이션에서 세션 검사를 하기 위해서는 사용자 인증 후 세션에 정보를 저장하고, 각 요청에 대해 해당 세션에 저장된 정보를 이용하여 검사하는 과정이 필요합니다. 세션 검사를 위해 고려해야 할 몇 가지 사항은 다음과 같습니다
1. 로그인 여부 확인: 사용자가 로그인 했는지 여부를 확인해야 합니다. 로그인하지 않은 사용자는 인증되지 않은 사용자로 간주하고, 해당 요청에 대한 접근 권한이 없습니다.
// HttpSession을 이용하여 세션 검사
@RequestMapping("/some-path")
public String someControllerMethod(HttpServletRequest request) {
HttpSession session = request.getSession(false);
if (session == null || session.getAttribute("user") == null) {
// 로그인하지 않은 사용자이므로 로그인 페이지로 이동
return "redirect:/login";
}
// 로그인한 사용자일 경우, 해당 컨트롤러 로직 수행
// ...
}
2. 세션 만료 확인: 세션은 일정 시간이 지나면 만료되기 때문에, 각 요청에 대해 세션이 만료되지 않았는지 확인해야 합니다. 세션이 만료되었을 경우, 다시 로그인을 요구하거나 세션을 갱신해야 합니다.
// HttpSession을 이용하여 세션 만료 검사
@RequestMapping("/some-path")
public String someControllerMethod(HttpServletRequest request) {
HttpSession session = request.getSession(false);
if (session == null) {
// 세션이 만료되었으므로, 다시 로그인 페이지로 이동
return "redirect:/login";
}
// 세션이 만료되지 않았을 경우, 해당 컨트롤러 로직 수행
// ...
}
3. 권한 검사: 로그인한 사용자라 하더라도 모든 요청에 대해 접근 권한이 있지는 않습니다. 각 요청에 대해 사용자가 요청에 필요한 권한을 가지고 있는지 확인해야 합니다.
// 세션에 저장된 사용자 정보를 이용하여 권한 검사
@RequestMapping("/some-path")
public String someControllerMethod(HttpServletRequest request) {
HttpSession session = request.getSession(false);
if (session != null && session.getAttribute("user") != null) {
// 세션에 사용자 정보가 존재하는 경우, 해당 사용자의 권한 검사
User user = (User) session.getAttribute("user");
if (user.hasPermission("some-permission")) {
// 해당 사용자가 "some-permission" 권한을 가지고 있는 경우, 해당 컨트롤러 로직 수행
// ...
} else {
// 해당 사용자가 "some-permission" 권한을 가지고 있지 않은 경우, 권한 오류 페이지로 이동
return "error-page";
}
} else {
// 로그인하지 않은 사용자이므로, 로그인 페이지로 이동
return "redirect:/login";
}
}
4. 보안 검사: 세션에 저장된 정보를 이용하여 인증하는 경우, 보안적으로 취약한 부분이 있을 수 있습니다. 예를 들어, 세션 ID를 URL 파라미터나 쿠키에 저장하고 사용하는 경우, URL 또는 쿠키가 탈취되면 다른 사람이 해당 세션을 이용할 수 있습니다. 이러한 보안적인 취약점에 대해 검사해야 합니다.
// HttpSession을 이용하여 보안 검사
@RequestMapping("/some-path")
public String someControllerMethod(HttpServletRequest request) {
HttpSession session = request.getSession(false);
if (session != null && session.getAttribute("user") != null) {
// 세션에 사용자 정보가 존재하는 경우, 보안 검사
String sessionId = session.getId();
String urlSessionId = request.getParameter("sessionId"); // URL 파라미터로 전달된 세션 ID
if (!sessionId.equals(urlSessionId)) {
// 세션 ID가 일치하지 않는 경우, 보안 오류 페이지로 이동
return "error-page";
}
// 세션 ID가 일치하는 경우, 해당 컨트롤러 로직 수행
// ...
} else {
// 로그인하지 않은 사용자이므로, 로그인 페이지로 이동
return "redirect:/login";
}
}
위와 같은 세션 검사를 통해 사용자가 보안적으로 안전하게 서비스를 이용할 수 있도록 보호할 수 있습니다.
세션 체크 방법
세션에 접근하려면 request에 접근해야 합니다.
HttpServletRequest request =((ServletRequestAttributes)RequestContextHolder.currentRequestAttributes()).getRequest();
back-end -> back-end 문법
1. redirectreturn "redirect:sessionOut.do/";
로그인이 null일때는 이동시키기 백엔드는 sendredirect로 이동시킴
/controller에서는 항상 jsp로 가는데, controller에서 controller로 이동할 때는 return "bbslist.do"라고는 적을 수 없다.
이렇게 백엔드에서 백엔드로 이동할 때는 "redirect:/bbslist.do" 라고 쓰면된다.(AOP도 백엔드)
2.forward
model.addAttribute("bbswrite", bbswrite);
forwardreturn "forward:/bbslist.do"
짐을 가지고 이동시키려면 model과 forward를 쓴다.
댓글 작성하기
- 필요한 컬럼은 seq, id, contetn, wdate 입니다.
- 댓글은 최신순으로 정렬합니다.(포트폴리오 작성시에는 좋아요순으로 정렬해보기)
댓글