JWT_Network

miin·2022년 1월 10일
0

Network

목록 보기
10/13
post-thumbnail

JWT(JSON Web Tokens)

  • 유저가 로그인 후 생기는 access token이라고 하는 암호화된 유저 정보를 첨부해서 요청을 보내게 된다
  • 앞서 언급했듯이 유저가 로그인에 성공한 후에는 access token이라고 하는 암호화된 유저 정보를 첨부해서 request를 보내게 된다.
    • 유저 로그인:

      POST /auth HTTP/1.1
      Host: localhost:5000
      Content-Type: application/json
      
      {
          "username": "joe",
          "password": "pass"
      }
    • access token:

      HTTP/1.1 200 OK
      Content-Type: application/json
      
      {
          "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZGVudGl0eSI6MSwiaWF0IjoxNDQ0OTE3NjQwLCJuYmYiOjE0NDQ5MTc2NDAsImV4cCI6MTQ0NDkxNzk0MH0.KPmI6WSjRjlpzecPvs3q_T3cJQvAgJvaQAPtk1abC_E"
      }
  • 그러면 서버에서는 access token을 복호화 해서 해당 유저 정보를 얻게 된다.
    • 예를들어 access token eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZGVudGl0eSI6MSwiaWF0IjoxNDQ0OTE3NjQwLCJuYmYiOjE0NDQ5MTc2NDAsImV4cCI6MTQ0NDkxNzk0MH0.KPmI6WSjRjlpzecPvs3q_T3cJQvAgJvaQAPtk1abC_E 를 복호화 하면 다음과 같은 정보를 얻는다:

      {
          user_id = 1 
      }
    • 복호화해서 얻은 유저 아이디를 통해 해당 유저가 누군지 알 수 있다.

  • 이런 절차의 목적은 해당 유저가 매번 로그인 하지 않도록 하는 것이다.
  • access token을 생성하는 방법은 여러가지가 있는데, 그 중 가장 널리 사용되는 기술중 하나가 바로 JWT(JSON Web Tokens)이다.
  • JWT는 말 그대로 유저 정보를 담음 JSON 데이터를 암호화 해서 클라이언트와 서버간에 주고 받는 것이다.

토큰 저장 위치

  • 서버가 토큰 발급후 브라우저에서 사용자/서버간에 토큰이 전달되는 방식은 크게 두가지로 나뉜다.
  1. 로그인에 성공하게 되었을 때 서버가 응답정보에 토큰을 넣어서 전달하도록 한다 ->
    해당 값을 웹 스토리지(localStorage 또는 sessionStorage)에 넣는다 ->
    그 다음부터 웹 요청을 할 때마다 HTTP 헤더 값에 넣어서 요청한다
    • 장점: 하나의 도메인에 제한되어 있지 않다
    • 단점: XSS 해킹 공격을 통해 해커의 악성 스크립트에 노출이 되는 경우 매우 쉽게 토큰이 탈취 될 수 있 다. 그냥 로컬스토리지에 접근하면 바로 토큰에 접근 할 수 있다.
  2. 발급받은 토큰을 쿠키에 넣는다. 단순히 쿠키를 정보 전송 수단으로 사용한다
    • 서버측에서 응답을 하면서 쿠키를 설정 해 줄때 httpOnly 값을 활성화 해주면, 네트워크 통신 상에서 해당 쿠키가 붙게 된다. 따라서 브라우저상에서는 자바스크립트로 토큰값에 접근하는것이 불가능하다
    • 앱 개발시: 서버측에서 JWT를 헤더 값으로도 받을 수 있게 하여 쿠키 혹은 헤더 둘 중 존재하는것을 토큰 으로 인식하여 사용하도록 구현 하면 된다
    • 단점
      a. 쿠키가 한정된 도메인에서만 사용이 된다.
      해결 방법으로는 토큰이 필요해질 때 현재 쿠키에 있는 토큰을 사용하여 새 토큰을 문자열로 받아올 수 있게 하는 API를 구현하여 해결하면 된다
      b. XSS의 위험에서 완전히 해방되는 대신, CSRF공격의 위험성이 생긴다.
      CSRF은 계정정보를 탈취하는것은 아니지만 스크립트를 통하여 사이트의 외부에서 사이트의 API를 사용하 는것 처럼 모방하는 것이다. 혹은 사이트 내부에서 스크립트가 실행되어 원하지 않는 작업이 수행되게 할 수도 있다.

액세스 토큰과 ID 및 암호를 사용하는 이유

성능

  • 무거운 비크립트 호출 없이 간단한 해시이다.

클라이언트측 스토리지

  • 쿠키와 같은 클라이언트에 저장된 실제 아이디와 비밀번호가 없다.
  • 또한 토큰은 서버마다 다르며 다른 사이트에서는 재사용되지 않는다.

0개의 댓글