Secure 및 HttpOnly 속성을 설정하여 쿠기 보안 강화※🌈 세션 하이재킹(Session Hijacking) 이란
- 공격자가 사용자의 세션ID(Session ID)를 가로채어 해당 사용자의 세션을 탈취하는 공격 기법입니다.
- 이를 통해서 공격자는 정상 사용자인 것처럼 서버에 접근하여 정보를 탈취하고, 불법적인 요청을 수행해 악의적인 행위를 할 수 있음
HttpServletRequest 에 메서드 getSession(true)이용해 생성HttpServletRequest 에 메서드 getSession(false)이용해 가져옴null을 반환합니다.HttpSession 에 메서드 session.setAttribute("key", value); 형태로 저장 HttpSession 에 메서드 session.getAttribute("key");HttpSession 에 메서드 session.setMaxInactiveInterval(1800); (단위:초)간단한 예제를 코드로 구현한다면
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private String email;
@Column
private String password;
// 기본 생성자
public User() {}
// getters and setters
}
@Getter
public class LoginRequsetDto {
private final String email;
private final String password;
}
@RestController
@RequestMapping("/users")
public class UserController {
private static final String USER_ID = "userId";
@PostMapping("/session-login")
public ResponseEntity<String> login(
@RequestBody LoginRequestDto request,
HttpServletRequest httpServletRequest
) {
\
User user = userService.login(request);
// 세션 생성
HttpSession session = httpServletRequest.getSession(true);
// 세션에 "key" 값을 userId 설정 "value" 값을 user.getId() 로 설정
session.setAttribute(USER_ID, user.getId());
// 세션 만료시간 30분으로 설정
session.setMaxInactiveInterval(1800); // 30분
return ResponseEntity.status(HttpStatus.CREATE).body("로그인 성공 및 세션 생성");
}
@GetMapping("/session-login")
public ResponseEntity<String> login(HttpServletRequest httpServletRequest) {
// 세션이 존재하면 세션값 반환, 세션 없을 경우 `null` 반환
HttpSession session = httpServletRequest.getSession(false);
// session 이 null 경우
if (session == null) {
return "세션이 없습니다."
}
// 현재 "key" 값(USER_ID)에 해당하는 value를 가져옴
return session.getAttribute(USER_ID);
Session을 이용하여 클라이언트와 서버간에 상태를 유지하는 방법에 대해서 알아보았습니다.
잘못된 부분에 대해 피드백을 주신다면 감사하겠습니다.