쿠키와 세션, JWT

KyungminLee·2021년 2월 23일
1

쿠키와세션, JWT

목록 보기
2/3
post-thumbnail
post-custom-banner

1. 쿠키와 세션, JWT를 사용하는 이유

HTTP 프로토콜의 특징

  • Connenctionless
    • client와 server가 요청을 한 번 주고받으면 연결을 끊어버리는 특성 때문
    • 클라이언트가 req 요청을 보내면 서버에선 res 응답 후 연결을 끊는다.
  • Stateless
    • 요청, 응답으로 통신이 끝나면 상태정보를 유지하지 않는 특성
    • 페이지 전환 시 상태정보가 초기화 된다.

위의 특징으로 인해 로그인을 하고 상품 구매하기 버튼을 클릭하면 누가 구매하기 버튼을 클릭한지 알 수 없다. 따라서 쿠키와 세션, JWT 등 인증 방법이 필요하다.

인증방식

1. 쿠키

쿠키는 클라이언트에 저장되는 key와 value로 이루어진 데이터이다.
인증 유효 시간을 설정할 수 있고 유효 시간이 정해진다면 클라이언트가 종료되어도 쿠키가 유지된다.
서버와 요청 응답으로 인해 쿠키가 저장되면 다음 요청은 쿠키에 담긴 정보를 이용해 참조한다.

[쿠키 동작 방식]

  • 클라이언트가 로그인 요청
  • 서버에서 쿠키 생성 후 클라이언트로 전달
  • 클라이언트가 서버로 요청을 보낼 때 쿠키를 전송
  • 쿠키를 이용해 유저 인증을 진행

그러나 문제점으로 사용자 인증에 대한 정보를 모두 클라이언트가 가지고 있게되므로 http 요청을 탈취당할 경우 쿠키 자체를 탈취당해 사용자 정보를 모두 빼앗길 수 있다.그래서 쿠키 자체는 보안과는 큰 상관이 없는 장바구니 혹은 자동로그인 설정 등에 이용할 수 있다.

2. 세션

세션은 쿠키를 기반으로 하지만 클라이언트에 저장하는 쿠키와는 다르게 서버에 저장하여 관리한다.
서버에서는 클라이언트를 구별하기 위해 각각의 세션ID를 클라이언트마다 부여하게되며 클라이언트가 종료되기 전까지 유지한다. 클라이언트에 저장하는 쿠키보다는 보안이 좋다.

[세션 동작 방식]

  • 클라이언트가 로그인 요청
  • 서버에서는 클라이언트에게 고유한 세션ID를 부여하고 세션 저장소에 저장한 후 클라이언트에게 발급한다.
  • 클라리언트는 서버에서 발급받은 세션ID를 쿠키에 저장하게 되고 요청을 보낼 때 마다 쿠키를 보낸다.
  • 서버는 쿠키에 담겨있는 세션ID와 세션 저장소에 있는 정보와 대조한 후 데이터를 가져온다.

세션 또한 문제점이 있는데 세션 하이재킹 공격이 가능하니 세션의 유효시간을 만들어 예방할 수 있다.
그리고 세션 저장소를 서버에서 관리하기 때문에 사용자가 많아지면 많아질수록 서버에 걸리는 부하가 증가한다.
동시 접속자가 많아지면 해결할 방법을 찾아야 될것이다.

3. JWT

JWT는 Json Web Token의 약자이고 인증에 필요한 정보들을 암호화시킨 토큰을 말한다.
세션 방식처럼 토큰 자체를 쿠키에 담아서 보내줄 수도 있고 HTTP 헤더에 담아서 보내줄 수도 있다.

토큰은 3가지 요소로 구성되어 있다.

  • Header: 3가지 요소를 암호화할 알고리즘 등과 같은 옵션이 들어간다.
  • Payload: 유저의 고유 ID 등 인증에 필요한 정보가 들어간다.
  • Verify Signature: Header, Payload와 Secret Key가 더해져 암호화된다.
  • Header.PayLoad.VerifySignature로 만들어진다.

Header와 Payload는 누구나 디코딩하여 내용을 확인할 수 있기때문에 유저의 비밀번호 같은 정보는 넣지 않도록 한다. 하지만 Secret Key를 알지 못하면 VerifySignature는 복호화할 수 없다.

그렇기 때문에 토큰을 변조하더라도 VerifySignature가 Payload를 기반으로 암호화 되었기 때문에 유효하지 않은 토큰으로 검증이 가능하다.

[토큰 동작 방식]

  • 클라이언트가 로그인 요청
  • 서버에서 유저의 고유한 ID와 다른 인증 정보들과 함께 Payload에 담는다.
  • JWT의 유효기간 설정 및 옵션을 설정해준다.
  • Secret Key를 이용해 토큰을 발급한다.
  • 발급된 토큰은 클라이언트에 쿠키 혹은 로컬스토리지 등에 저장하여 요청을 보낼 때마다 같이 보낸다.
  • 서버는 토큰을 Secret Key로 복호화하여 검증하는 과정을 거친다.
  • 검증이 완료되면 대응하는 데이터를 보내준다.

간략한 쿠키-세션, JWT 인증방식

1. 세션기반 인증방식

  • 클라이언트가 로그인
  • 성공하면 서버가 유저 세션을 만들고 메모리나 데이터베이스에 저장한다.
  • 서버가 클라이언트에게 세션 ID를 보낸다.
  • 클라이언트의 브라우저에 세션의 ID만 쿠키에 저장하게 한다.

2. JWT 인증방식

  • 클라이언트가 로그인을 하면, 서버로부터 access 토큰을 부여받는다.
  • 이후 클라이언트가 모든 api 요청을 할 때 access 토큰을 포함시킨다.
  • 서버는 access 토큰을 해독해 확인하고 검증되면 해당 api 기능을 수행한다.
  • 기한이 만료되었으면 access 토큰을 지워주고 재로그인을 하게 한다.
profile
끊임없이 발전해가는 개발자.
post-custom-banner

0개의 댓글