HTTP프로토콜은 무상태 프로토콜로 이전과 이후의 통신상태와는 독립적으로 사용된다.
하지만 무상태 프로토콜을 이용하지만 로그인 유지 같은 사용자의 상태를 포함해야하거나 인가가 필요한 상황에서는 세션을 사용하거나 토큰을 HTTP Request Header 내에 넣어 사용한다.
위치
둘 다 인증(로그인)시에 생성되고 중요한 것은 저장이 되는 위치이다.
세션
로그인 성공 시에 해당 유저의 세션을 서버에서 저장하고, 클라이언트에게는 세션id를 넘겨준다. 이후에 로그인이 필요한 서비스에 접근할 때(인가)는 HTTP Request의 헤더에 세션 id를 추가해서 보내고, 서버는 관리중인 세션중에 넘겨받은 세션id와 일치하는 세션이 있다면 세션의 Role을 확인하고 접근을 허가한다.
토큰
로그인 성공 시에 서버는 해당 유저의 정보를 담은 토큰을 생성하고, 클라이언트에게 넘겨준다. 클라이언트는 서버로부터 받은 토큰을 저장하고 이후 로그인이 필요한 서비스에 접근할때는 HTTP Request의 헤더에 토큰을 추가해서 보내고, 서버는 토큰의 유효성 검증을 진행해 토큰이 유효하다면, 토큰내의 Role을 확인하고 접근을 허가한다.
보안
세션
서버에서 관리하기 때문에 상대적으로 안전하다. 하지만 세션 id를 탈취당하는 등의 공격 위험이 있기에 HttpOnly, Secure 등의 보안 옵션을 적용한 쿠키를 사용한다.
토큰
클라이언트에 저장되기 때문에 상대적으로 위험하다. 그렇기에 토큰에는 비밀번호와 같은 민감정보를 담지 않고, 유효기간을 짧게 설정하고, 유효기간이 좀 더 긴 refresh token을 추가적으로 발급해 기존 토큰의 만료, 변질시에 토큰을 재발급 받는다.
확장성(처리비용)
서버의 성능을 올리는 방법에는 사용하는 서버의 성능을 올리는 방법(Scale Up)과 동일한 성능의 서버를 추가(Scale Out)이 있다.많은 회사들이 동일한 성능 대비 가격이 싼 Scale Out을 채택해서 세션 사용시에는 여러 서버에서 세션에 접근할 수 있는 세션 서버를 만들거나, 세션 클러스터링 서비스를 이용한다.
하지만 추가되는 처리비용이 발생하기 때문에 서버에서 사용자를 트래킹하는 서비스(ex : 넷플릭스의 원하지 않는 디바이스의 강제 로그아웃)가 필요하지 않으면 토큰을 사용해 처리비용을 줄이면서 확장성을 가져간다.
참고