바로 직전의 통신도 기억 못하는 HTTP
HTTP는 stateless한 특성을 가지기 때문에 각 통신의 상태는 저장되지 않습니다.
하지만 우리가 웹 서비스를 사용할 때를 생각해봅시다.
매번 새 페이지를 요청할때마다 로그인을 해야 한다면 사용이 불가능할 것입니다.
기억하는 척 하기 위해 사용되는 세션과 토큰
이 문제를 해결하기 위한 대표적인 도구 두 가지가 바로 세션(Session)과 토큰(Token)입니다.
유저가 로그인을 시도할 때 서버상에서 일치하는 유저 정보를 찾았다면
인증(Authentication) 확인의 표시로 세션이나 토큰을 발급/전달해줍니다.
그럼 웹 브라우저 측에서 해당 세션/토큰 정보를 받아 간직하고 있다가
새로운 request를 보낼 때마다 인가(Authorization)를 위해 해당 세션/토큰을 함께 보냅니다.
그런데 세션과 토큰 모두 존재 목적은 거의 같지만 차이점은 존재합니다.
그 중 가장 큰 차이점은 세션은 데이터베이스 서버에 저장된다는 것,
토큰은 클라이언트 측에서만 저장한다는 점입니다.
참고 : https://fierycoding.tistory.com/69
<!-- mongodb로 세션을 관리하기 위해 -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-mongodb</artifactId>
</dependency>
@EnableMongoHttpSession
(collectionName = "sessions", maxInactiveIntervalInSeconds = 1800)
public class Boot20220228Application {
public static void main(String[] args) {
SpringApplication.run(Boot20220228Application.class, args);
}
// @Bean => 프로그램이 구동되기 전에 미리 만들어지는 객체
// JacksonMongoSessionConverter obj = new JacksonMongoSessionConverter()
// 이렇게 하고 싶은데 이건 프로그램이 구동되고 만들어지는 거임
// 몽고 DB에서 attr을 쉽게 확인하기 위해서, 객체, 배열 x 문자는 됨
// @Bean
// public JacksonMongoSessionConverter mongoSessionConverter() {
// return new JacksonMongoSessionConverter();
// }
mongoDB에 세션이라는 콜렉션을 사용하고, 1800초를 사용한다.
세션의 유효 시간은 기본적으로 30으로 잡혀 있다
1800초는 처음 세션을 발급받은 시점이 아닌 마지막으로 동작한 시점으로부터 시작한다.
public class MemberController {
@Autowired
private HttpSession httpSession;
@Autowired
private MemberDB memberDB;
컨트롤러에 다음과 같이 autowired한다.
이렇게 메소드 안에 넣어도 되지만, 이렇게 따로 하게 되면, 반복의 번거로움이 있다.
위에 한 번에 autowired해주면 됨. 위에 autowired를 해주게 된다면, 아래에서 사용할 때는 파라미터에 넣으면 안된다. 다른 httpsession이 되기 때문.
String userid = (String) httpSession.getAttribute("USERID");
세션을 사용할 때는 HttpSession타입으로 들어가기 때문에 강제 형변환을 해줘야한다.
세션 지우기
httpSession.invalidate();
세션을 사용하고 나서, 지울 때는 다음과 같은 코드를 사용하면 됨.