session

이태규·2022년 3월 13일
0

spring

목록 보기
11/64

세션과 토큰

바로 직전의 통신도 기억 못하는 HTTP

HTTP는 stateless한 특성을 가지기 때문에 각 통신의 상태는 저장되지 않습니다.

하지만 우리가 웹 서비스를 사용할 때를 생각해봅시다.

매번 새 페이지를 요청할때마다 로그인을 해야 한다면 사용이 불가능할 것입니다.

기억하는 척 하기 위해 사용되는 세션과 토큰

이 문제를 해결하기 위한 대표적인 도구 두 가지가 바로 세션(Session)과 토큰(Token)입니다.

유저가 로그인을 시도할 때 서버상에서 일치하는 유저 정보를 찾았다면

인증(Authentication) 확인의 표시로 세션이나 토큰을 발급/전달해줍니다.

그럼 웹 브라우저 측에서 해당 세션/토큰 정보를 받아 간직하고 있다가

새로운 request를 보낼 때마다 인가(Authorization)를 위해 해당 세션/토큰을 함께 보냅니다.

그런데 세션과 토큰 모두 존재 목적은 거의 같지만 차이점은 존재합니다.

그 중 가장 큰 차이점은 세션은 데이터베이스 서버에 저장된다는 것,

토큰은 클라이언트 측에서만 저장한다는 점입니다.

참고 : https://fierycoding.tistory.com/69

세션 사용하기

  1. pom.xml에 dependency 추가하기
<!-- mongodb로 세션을 관리하기 위해 -->
		<dependency>
		    <groupId>org.springframework.session</groupId>
    		<artifactId>spring-session-data-mongodb</artifactId>
		</dependency>
  1. application.java에 어노테이션 추가하기
@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();

세션을 사용하고 나서, 지울 때는 다음과 같은 코드를 사용하면 됨.

profile
한 걸음씩 나아가자

0개의 댓글