본문 바로가기
Web/etc

쿠키 / 세션 / 토큰 / JWT

by 09337 2022. 10. 15.

쿠키 / 세션 / 토큰

  • 쿠키 인증: key-value 형식의 문자열 / 클라이언트가 어떠한 웹사이트를 방문할 경우, 그 사이트가 사용하고 있는 서버를 통해 클라이언트의 브라우저에 설치되는 작은 기록 정보 파일이다. 요청 시 쿠키의 값을 그대로 보낸다는 취약점이 존재한다.
  • 세션 인증: 쿠키의 보안적 이슈 때문에 비밀번호 등 클라이언트의 민감한 인증 정보를 브라우저가 아닌 서버 측에 저장하고 관리한다. 민감한 정보는 클라이언트에 보내지 않고 서버에서 모두 관리한다.
  • 토큰 인증: 클라이언트가 서버에 접속을 하면 서버에서 해당 클라이언트에게 인증되었다는 의미로 '토큰'을 부여한다. 이 토큰은 유일하며 토큰을 발급받은 클라이언트는 또 다시 서버에 요청을 보낼 때 요청 헤더에 토큰을 심어서 보낸다. 그러면 서버에서는 클라이언트로부터 받은 토큰을 서버에서 제공한 토큰과 일치한지 체크하여 인증 과정을 처리한다. 세션과는 달리 서버가 아닌 클라이언트에 저장되기 때문에 서버의 부담을 덜 수 있다. 토큰 자체에 데이터가 들어있기 때문에 클라이언트에서 받아 위조되엇는지 판별만 하면 되기 때문이다. (토큰은 앱과 서버가 통신 및 인증할 때 가장 많이 사용)
  • 개인키: 자신만이 갖고있다.(= 비공개키, 비밀키)
  • 공개키: 누구에게나 공개가 가능하다.

JWT

JWT(JSON Web Token): 인증에 필요한 정보들을 암호화시킨 JSON 토큰

 

JSON 데이터를 Base64 URL-safe Encode를 통해 인코딩하여 직렬화한다. 토큰 내부에는 위변조 방지를 위해 개인키를 통한 전자서명도 들어있다. 사용자가 JWT를 서버로 전송하면 섭는 서명을 검증하는 과정을 거치게 되며 검증이 완료되면 요청한 응답을 돌려준다.

 

JWT 구조(.을 구분자로 나누어지는 세 가지 문자열의 조합으로 이루어져 있다.)

  • 헤더.내용.서명
  • 헤더: JWT에서 사용할 타입과 해시 알고리즘의 종류가 담겨있다.
  • 내용: 서버에서 첨부한 사용자 권한 정보와 데이터가 담겨있다.
  • 서명: 헤더, 내용을 Base64-URL-safe Encode를 한 이후 헤더에 명시된 해시 함수를 적용하고, 개인키로 서명한 전자서명이 담겨있다. 전자서명에는 비대칭 암호화 알고리즘을 사용하므로 암호화를 위한 키와 복호화를 위한 키가 다르다. 암호화(전자서명)에는 개인키를, 복호화(검증)에는 공개키를 사용한다.

개인키로 암호화를 하는 경우, 개인키의 소유자가 개인키로 데이터를 암호화하고 공개키와 함께 전달한다.

이 과정에서 공개키와 데이터를 획득한 사람은 공개키를 이용하여 복호화가 가능한데, 이럼 위험에도 불구하고 이 방법을 사용하는 이유는 데이터 보호의 목적보다는 공개키가 데이터 제공자의 신원을 보장해주기 때문이다.

'Web > etc' 카테고리의 다른 글

CI / DI / SSO  (0) 2022.10.15

댓글