쿠키
1.지속 쿠키
만료기간있다( Expires또는 Max-Age라는 값이 있고 이를 초과하는 경우 사라짐)
브라우저를 닫아도 존재함
2.세션 쿠키
만료기간없다( Expires또는 Max-Age라는 값이 없다. session이라는 값이 있다)
브라우저를 닫는 순간 사라진다
쿠키의 파라미터에 대한 설명
Path : 서버에 있는 특정 경로만 쿠키를 할당. 경로가 명시되어있지 않으면, Set-Cookie 응답을 전달하는 URL의 경로가 사용됨
Secure : 이 속성이 포함되면, 쿠키는 HTTP가 SSL 보안 연결 사용할 때만 쿠키를 전달
HttpOnly : document.cookie등을 이용해 JS에서 해당 쿠키를 사용할수없게 만듬 xss등 방어를 위해 사용
세션(서버세션)
앞서 설명한 세션쿠키와 세션은 다르다
세션은 서버에서 클라이언트 식별값을 관리하는 기법을 말한다
쿠키에 세션ID를 저장하고 서버에서 해당 세션ID에 해당하는 값(클라이언트식별값)을 저장한다
(서버에 민감한 정보를 저장하기에 보안상 우수)
세션과 쿠키의 차이
저장공간의 차이가 있다
세션은 서버에 값(클라이언트 식별값)을 저장한다
쿠키는 브라우저에 값(클라이언트 식별값)을 저장한다
실제로 세션과 쿠키의 이미지
0. 세션과 세션쿠키를 사용해서 로그인을 구현했음을 알수있다
1. 아래의 이미지에서 첫번째 JSESSIONID가 세션 쿠키에 저장된 세션ID이다
2. 또한 세션과 쿠키를 이용해서 로그인을 구현했을때 세션쿠키를 사용했음을 알수있다
세션을 사용한 로그인 구조 (0529추가)
⓪ 유저가 로그인 정보를 입력하고 올바르다면 서버에서 세션쿠키의 정보(JSESSIONID를 가진 쿠키)를 클라이언트에 전달 ( response의 헤더에 담아서 보냄 )
① 유저가 해당 세션쿠기의 정보를 클라이언트에 저장
* 세션쿠키와 지속쿠키는 다르다. 세션쿠키는 expires가 Session으로된 쿠키이며 만료기간이 없고 브라우저를 닫는 순간 사라진다
② 사용자가 요청을 서버에 전송한다. 전송하는 Request헤더에 세션쿠키(JSESSIONID를 가진 쿠키)를 담아서 서버에 보낸다
③ 서버는 클라이언트로 받은 세션쿠키의 JSESSIONID의 값과 일치하는 값을 서버에서 찾는다
( 세션쿠키의 JSESSIONID의 값과 일치하는 값을 서버에 저장하는것을 세션이라고 한다. 세션은 데이터 저장방식을 말함 )
④ 일치하는 정보가 있을 경우 사용자가 요청한 정보를 반환한다
⑤ 사용자가 로그아웃하면 서버의 저장된 세션쿠키에 대한 정보를 삭제한다.
또한 유저가 브라우저를 닫을 경우 브라우저의 세션쿠키가 없어지기 때문에 해당 경우에도 클라이언트에서 삭제된다
토큰(jwt)
jwt 토큰 형식은 아래와 같다
매번 request마다 아래 구조의 토큰을 서버로 보냄(실제로 헤더에 저장함)
{
url:”/post/getdata”
method:”post”
data:”{요청데이터}”
token:”111.222.333”
}
jwt 토큰의 구조
token:”헤더.페이로드.암호화된서명”
-헤더:토큰정보헤더(111)
-페이로드:토큰인증정보(222)
-암호화된서명:서버에서 클라이언트에 보내기전 헤더+페이로드+개인키를 합쳐서 암호화한 값(333)
서버에서 인증과정 (중요)
1.위의 형식으로 토큰을 서버에 넘기면 서버는 넘겨받은 토큰의 암호화된 서명을 서버가 가지고 있는 개인키를 사용하여 암호화된 서명(333)부분을 복호화함.
2.암호화된 서명(333)을 복호화한 값의 헤더+페이로드와 클라이언트에서 전송한 헤더+페이로드의 값이 일치하는지 확인한다
3.일치하면 통과
참조