쿠키/세션/토큰 ( 세션로그인방식 )

쿠키
1.지속 쿠키
- 만료기간있다( Expires또는 Max-Age라는 값이 있고 이를 초과하는 경우 사라짐)
- 브라우저를 닫아도 존재함
2.세션 쿠키
- 만료기간없다( Expires또는 Max-Age라는 값이 없다. session이라는 값이 있다)
- 브라우저를 닫는 순간 사라진다
쿠키의 파라미터에 대한 설명
- Path : 서버에 있는 특정 경로만 쿠키를 할당. 경로가 명시되어있지 않으면, Set-Cookie 응답을 전달하는 URL의 경로가 사용됨
- Secure : 이 속성이 포함되면, 쿠키는 HTTP가 SSL 보안 연결 사용할 때만 쿠키를 전달
- HttpOnly : document.cookie등을 이용해 JS에서 해당 쿠키를 사용할수없게 만듬 xss등 방어를 위해 사용
세션(서버세션)
-
앞서 설명한 세션쿠키와 세션은 다르다
-
세션은 서버에서 클라이언트 식별값을 관리하는 기법을 말한다
-
쿠키에 세션ID를 저장하고 서버에서 해당 세션ID에 해당하는 값(클라이언트식별값)을 저장한다
(서버에 민감한 정보를 저장하기에 보안상 우수)
세션과 쿠키의 차이
- 저장공간의 차이가 있다
- 세션은 서버에 값(클라이언트 식별값)을 저장한다
- 쿠키는 브라우저에 값(클라이언트 식별값)을 저장한다
실제로 세션과 쿠키의 이미지
-
세션과 세션쿠키를 사용해서 로그인을 구현했음을 알수있다
-
아래의 이미지에서 첫번째 JSESSIONID가 세션 쿠키에 저장된 세션ID이다
-
또한 세션과 쿠키를 이용해서 로그인을 구현했을때 세션쿠키를 사용했음을 알수있다

세션을 사용한 로그인 구조 (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.일치하면 통과
참조