2024-05-10 (102일차) - JWT(JSON Web Token)

·2024년 5월 10일

JWT(JSON Web Token)

  • 선택적 암호화를 사용하여 데이터를 만듬
  • 토큰은 비공개 시크릿 키 또는 공개/비공개 키를 사용하여 서명된다.

인증

  • 신원확인
  • 요청을 횟수로만 받으면 누군지 신원확인이 어렵다
    • 이걸 해결하기 위해 도입된 것이 쿠키

쿠키

  • 구분을 하기 위함
  • 서버와 클라이언트의 공유데이터
  • 각 브라우저의 고유번호를 준다

쿠키세션


클라이언트 : 브라우저
서버: 웹서버

아이폰 앱 / 웹 서버
안드로이드 앱 / 웹 서버

2008년도 아이폰/안드로이드는 브라우저가 아니라서 쿠키가 없음

쿠키가 없어

  • 세션키를 저장 할 수 없어
  • 로그인을 유지할 수 없어


앱에서 서버로 그냥 데이터를 전송하면 누군지 모르니까 id랑 pw를 한묶으로 같이 보냄

결론


최초 요청 : ID / PW
그 다음 요청 : 제목 / 내용
그 다음 요청 : 제목 / 내용


최초 요청 : ID / PW
그 다음 요청 : ID / PW / 제목 / 내용
그 다음 요청 : ID / PW / 제목 / 내용

ID/PW는 앱 측에서 기억해논다

계정

  • ID / PW

토큰은 만료시킬 수 있는 계정

  • test1 / 1234
  • 12345623453659837598235987
    • 토큰

토큰이 발명되기 전,

앱시작

  • 아이디 비번을 입력
  • 앱이 서버에게 해당 아ㅣ이디 비번이 유효한지 물어봄
  • 유효하면 앱은 그 아이디 / 비번을 영구 저장한다.
  • 글쓰기 -> HTTP POST title, body, di ,pw
    좋아요 -> HTTP POST aritlceId, id, pw

토큰이 발명되고 나서,

앱시작

  • 아이디 비번을 입력
  • 앱이 서버에게 해당 아ㅣ이디 비번이 유효한지 물어봄
  • 유요하면 서버가 토큰을 발급해준다
    • 토큰으로 id/pw 역할을 할 수 있다
  • 유효하면 앱은 그 아이디 / 비번을 영구 저장한다.
  • 글쓰기 -> HTTP POST title, body, id ,pw
    좋아요 -> HTTP POST aritlceId, id, pw

굳이 왜 이렇게 하지?

id/pw -> 누군지 신원확인
토큰 -> 누군지 신원확인

해킹 당하면, id/pw도 털리지만 토큰도 털림

  • id/pw 털리면, 아이디는 못바꾸지만 사이트 로그인 후 비번 바꿀 수 있음
  • 토큰이 털리면, 전 기기에서 로그아웃

DB의 member 테이블에

  • id
  • createDate
  • modifyDate
  • loginId
  • loginPw
  • name
  • email
  • phoneNum
    .
    .
  • token

토큰을 써서 좋은 점 2가지

  • 찝찝하지 않아~
  • 비번 바꾸기 귀찮~

토큰을 쓰면서 불만이 생김

  • 신원확인을 할 때 DB SELECT를 해야한다.
  • 글을 쓸때는 일단 유효한 토큰인지 검사해야하니,
SELECT * FROM member 
WHERE token = '123412341234';

세션값이 있는지 없는지

토큰의 단점

  • 로그인 여부를 SELECT를 통해 알아야 함

그러나 100% 정답은 아님.

세션

  • DB 저장소로 쓰는 사람도 있고
    캐쉬도 있음

브라우저 - 로그인 여부를 DB조회 없이 하고싶은데
토큰을 사용하면 DB사용을 안할 수가 없어~
내가 글을 1000번 쓰면 DB에서 select를 1000번 해야하는거지.

SELECT * FROM member 
WHERE token = '123412341234';

여기 토큰 값에 의미있는 데이터를 저장할 수 없나?
있지~ 여기서 나온게 바로 JWT!


JWT

  • 유효성 체크, CPU 연산
  • 데이터를 담을 수 있는 토큰

옛날토큰

  • 12312312341212312312312

JWT

  • {"id" :1, "name": "홍길동", "age": 22}
    -> eyJpZCIgOjEsICJuYW1lIjogIu2Zjeq4uOuPmSIsICJhZ2UiOiAyMn0=

https://www.base64decode.org/
여기서 encode를 하면 아래와 같이 토큰이 발행이 된다.

-> Hash(시크릿키)
-> JWT

=== 옛날 토큰 방식 ===
번호: 1
아이디 : abcd
비번 : 1234
이름 : 홍길동
나이 : 22
토큰 : 11112312314432523

SELECT * FROM member
WHERE token = '11112312314432523';

=== 새 토큰 방식 ===
"번호": 1
"아이디" : "abcd"
"비번" : 1234
"이름" : "홍길동"
"나이" : 22
"토큰" : "11112312314432523"

WHERE token = '11112312314432523';
새 토큰방식은 이런거 하지 않아도 됨

https://www.base64decode.org/
여기서 토큰을 decode를 하면

eyJpZCIgOjEsICJuYW1lIjogIu2Zjeq4uOuPmSIsICJhZ2UiOiAyMn0=
{"id" :1, "name": "홍길동", "age": 22}

정보가 나온다.

그러나 단순 변환을 한거라서 데이터를 신뢰할 수 없대.

  • 시크릿키 -> decode ->

복호화

JWT
JWT 만들때 유효기간 설멍

  • 5분짜리
  • 정말 내가 만들었나? 체크

member

  • token
  • 시크릿키 : 이 토큰이 정말 내가 만들었는지?
  • 토큰을 DB
profile
hello world

0개의 댓글