http란?
세션, 쿠키, 토큰을 물어봤는데 왠 http? 우선 이 3가지 개념을 설명하기 전에 http부터 알아야 한다.
http는 hyper text transfer protocol의 약자로, 인터넷에서 데이터를 주고받을 수 있는 규칙의 하나이다. http는 사용자가 요청(request)을 하면 서버에서는 해당 요청사항에 맞는 결과를 찾아서 사용자에게 응답(response)하는 형태로 동작한다. 여기서 http의 문제가 발생한다. http는 말 그대로 요청을 보내면 응답만하는 요청-응답, 요청-응답의 형태이기 때문에 정보를 저장할 수 없다. 이는 http의 특징인 스테이트 레스(stateless) 프로토콜 때문이다. 이전의 요청과 응답과정의 상태(state)를 알 수가 없다는 말이다. 하지만 개발을 하다보면 이전의 상태를 알아야 할 경우가 생긴다. 그렇기 때문에 우리는 http가 저장하지 못하는 정보들을 저장해주는 기능을 필요로 하게되는데 이를 세션, 쿠키 또는 토큰을 이용하여 구현한다.
쿠키(Cookie)
쿠키는 사용자가 웹 사이트를 처음 방문할 때 사용자의 정보가 담긴 작은 파일을 하나 사용자의 하드에 저장 해놓은 것이다. http의 특징상 저장할 수 없었던 상태 정보를 사용자의 pc에 저장해놨다가 다시 재사용한다고 생각하면 이해하기 쉽다. 예를 들어서 인터넷 쇼핑몰에서 쇼핑을 한다고 생각해보자. 보통 쇼핑몰에서 쇼핑을 하다가 뒤로가기를 눌러도 계속 로그인이 유지된다. 물론 다른페이지로 이동해도 유지된다. 하지만 원래 http의 특성을 보면 이는 불가능하다. 스테이트레스(stateless)하기 때문에 이전 상태를 계속 기억 못하고 계속 로그인을 요구하는게 정상 같아 보인다. 하지만 여기서 쿠키를 사용하여 사용자가 로그인한 상태임을 저장해 놓으면 쇼핑몰을 이용할때 일일이 로그인을 하지 않아도 된다.
쿠키의 구성요소
name : 쿠키 이름
value : 쿠키에 저장한 값
expires : 쿠키를 언제 삭제 할지 정함
domain : 쿠키가 사용되는 도메인
path : 쿠키를 반환할 경로
secure : 보안연결 설정
httpOnly: http외에 다른 통신 사용가능 여부 설정
쿠키의 단점
이런 쿠키도 단점이 존재한다. 사용자의 정보를 저장하기 때문에 민감한 정보가 쿠키에 담겨있는데 이게 외부로 유출되거나 쿠키 파일을 열어보면 보안상의 문제가 생길 수 있다. 또한 쿠키 정보를 매번 http 요청 header에 넣어서 보내야 하기 때문에 트래픽이 커진다.
세션(Session)
쿠키의 이런 단점을 보완하고자 나왔다. 쿠키의 보안상 이슈는 로컬에 파일을 저장하기 때문에 노출될 위험성이 크다는 것이었는데 세션은 서버에서 이를 관리한다. 간단히 과정을 살펴보면 클라이언트는 서버에 접속하면 서버로부터 session id를 부여 받게 되고 이는 접속한 서버에 저장된다. 부여받은 session id는 다시 쿠키 형태로 브라우저에 저장되고 이는 브라우저 종료시에 사라진다. 쿠키는 민감할 수도 있는 정보를 로컬에 저장하고 그걸 다시 header에 담아 보내서 인증을 받는 방식이었지만, 세션은 session id만 서버로 보내서 인증을 받으면 되기 때문에 쿠키보다 보안상 안전하고 트래픽도 적은 편이다.
세션의 단점
세션도 단점은 있다. 일단 어떤 형태이건 서버에 session id가 저장되기 때문에 클라이언트가 많아지면 그 만큼 서버에 저장해야할 session id도 많아진다. 이 때문에 서버에 과부하를 줄 수 있다. 또한 여러개의 서버를 운영한다면 각각의 서버가 모두 클라이언트의 session id를 공유해야한다. 안그러면 다른 서버로 연결 되었을때 인증이 안되는 불상사가 생기기 때문이다.
토큰(token)
토큰은 위 둘의 단점을 없앤 방식으로, 모던 웹서비스에서 많이 사용하고 있다. 일단 대략적인 과정을 보면 유저가 검증된 유저라는것이 서버에서 확인되면 서버는 유저에게 서명이 적힌 토큰이라는 것을 발급한다. 클라이언트 측에서는 이를 저장해두고 서버에 요청을 보낼때 마다 이 토큰을 같이 전송한다. 서버는 이 토큰을 다시 검증하고 클라이언트 요청에 응답 한다. 쿠키에는 민감한 정보도 담기고 이를 매번 header에 넣어주어야 했는데 토큰을 사용하면 토큰만 보내면 된다. 그리고 서버에서는 세션을 관리할 필요 없이 실려온 토큰이 유요한지만 검사하면 된다. 앞선 방식의 문제점들을 모두 개선했다고 볼 수 있다.
참고자료 : https://hahahoho5915.tistory.com/32
참고자료 : https://velopert.com/2350