01. WIL (5/9 ~ 5/12)

김채운·2022년 5월 17일
0

WIL

목록 보기
3/5
post-thumbnail

항해의 첫주가 지나고 쓰는 WIL 되시겠다...!
5월 9일을 시작으로 4일동안 미니 프로젝트를 진행했다.
프로젝트로 만들고자 했던건 '산넘고 산넘어' 프로젝트!!
등산을 사랑하는 사람들을 위한 소셜미디어 페이지를 만들어 보았는데..
첫날부터 코드 짜려니 쉽지 않았는데 4일 밖에 시간이 없어서 진짜 우당탕탕 거리면서 만들었다.
막막했던 4일이지만 능력있는 팀장님과 좋은 팀원들 덕분에 짧은 시간내에 집중해서 그래도 결과물을 낼 수 있었던 것 같다! 그치만 정신없이 코드를 짜고 복붙하고 하다보니 다시 그 코드를 짜라하면 못 짤 것 같다..ㅎ; 그래서 프로젝트가 끝난 지금 시점에 코드를 다시 들여다보는 시간을 가져야겠다.
그래서 만들어낸 결과물은,

👉산넘고 산넘어 README 여기서 확인해 볼 수 있다.

이 프로젝트에는 JWT의 형식을 사용해서 로그인 기능을 구현 했는데 로그인 파트를 맡지 않아서 JWT가 어떻게 사용이 되었는지 코드를 짤 때는 알 수 없었다. 내가 맡은 부분은 아니었지만 중요한 개념이라고 생각이 들어서 두고두고 보기 위해 정리를 해보았다!

JWT(Json Web Token)는 뭘까?

jwt는 유저를 인증하고 식별하기 위한 토큰기반 인증이다.
토큰기반 인증이란 세션과는 다르게 서버가 아닌 client에 사용자의 정보가 저장된다.

❗JWT의 구조

JWT는 Header.payload.Signature의 형태로 구성되어 있고 . 으로 구분된다

Header

  • JWT를 어떻게 검증하는지에 대한 내용이 들어가 있다.
  • JWT에서 사용할 토큰의 타입, 암호화 알고리즘이 어떤 알고리즘인지에 대한 정보, 해시 알고리즘의 이름이 담겨있다.

payload

  • 서버에서 첨부한 사용자 권한 정보와 데이터가 담겨있다.
  • Token에 담아서 우리가 보내고자 하는 데이터가 여기에 담겨져 있다. 이 정보 조각을 claim이라고 한다.
  • Key-Value의 쌍으로 이루어져 있고 payload에는 여러 claim을 담을 수 있다.
  • claim(정보)을 공개(public)로 할지 비공개(private)로 할지 등록(registered)할 것인지를 결정할 수 있다.

signature

  • Header와 Payload를 합친 문자열을 서명한 값이다.
  • Header의 alg에 정의된 알고리즘과, Payload를 Base 64URL-safe Encode로 인코딩 한다. 그 후 Header에 명시된 해시함수를 적용한다.
  • 개인키(Private Key)로 서명한 전자서명이 담겨있다.
  • secret key를 포함하고 있어서 암호화 되어있다.

❗JWT 진행 순서

  1. client가 아이디, 패스워드를 통해 웹서비스 인증
  2. 서버에 서명된 JWT를 생성하여 client에 응답으로 돌려주기
  3. client가 서버에 데이터를 추가적으로 요구할 때 JWT를 HTTP Header에 첨부
  4. 서버에 client로부터 온 JWT를 검증

JWT 토큰 내부에는 위변조 방지를 위해 개인키를 통한 전자서명도 들어있다. 따라서,
사용자가 JWT를 서버로 전송하면 서버는 서명을 검증하는 과정을 거치게 되며 검증이 완료되면 요청한 응답을 돌려준다.

❗특징

  • Token 자체에 사용자의 권한 정보나 서비스를 사용하기 위한 정보가 포함.
  • 세션과는 다르게 사용자 정보(Token)을 client(브라우저)에 담아두기 때문에 서버의 부담을 줄일 수 있다.
  • JWT는 웹표준으로 규격이 정해져 있어서 어떤 client(웹, 모바일)에서든 호환성이 뛰어나다.
  • Token이 서버가 아닌 client에 저장이 되기 때문에 사용자 정보가 변경이 되어도 알아서 갱신되지 않는다.
  • Token을 client에 저장하고 요청시 HTTP Header에 토큰을 첨부하는 것만으로도 단순하게 데이터를 요청하고 응답 받을 수 있음. 그래서 해당 토큰이 유효한지만 체크 해주면 된다. 어떤 서버로 보내도 상관이 없다.
  • 사용자 정보가 많아져서 토큰이 커질수록 거의 모든 요청에 대해 전송되므로 데이터 트래픽 크기에 영향을 미칠 수 있다.
  • 서버에 저장하지 않아서 서버의 확장성에 좋다.

참고

0개의 댓글