본문 바로가기
❤️‍🔥TIL (Today I Learned)

[TIL] 2022-12-15(35day)

by elicho91 2022. 12. 18.

Project MySelectShop - JWT


👉 JWT 

- Json 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token

(토큰의 한 종류 / 보통 쿠키 저장소에 담겨서 위에서 배운 ‘저장된 쿠키’라고 생각)

 

# 장점

 - 동시 접속자가 많을 때 서버 측 부하 낮춤
 - Client, Sever 가 다른 도메인을 사용할 때
    - 예) 카카오 OAuth2 로그인 시 JWT Token 사용

 

# 단점

 - 구현의 복잡도 증가
 - JWT 에 담는 내용이 커질 수록 네트워크 비용 증가 (클라이언트 → 서버)
 - 기 생성된 JWT 를 일부만 만료시킬 방법이 없음
 - Secret key 유출 시 JWT 조작 가능

 

 

# JWT 사용 흐름

  1. Client 가 username, password 로 로그인 성공 시
    1. "로그인 정보" → JWT 로 암호화 (Secret Key 사용)
    2. Sample
    3.  
    4. JWT 를 Client 응답에 전달
      1. JWT 전달방법은 개발자가 정함
        **Authorization: BEARER** <JWT>
        
        ex)
        **Authorization: BEARER** eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzcGFydGEiLCJVU0VSTkFNRSI6IuultO2DhOydtCIsIlVTRVJfUk9MRSI6IlJPTEVfVVNFUiIsIkVYUCI6MTYxODU1Mzg5OH0.9WTrWxCWx3YvaKZG14khp21fjkU1VjZV4e9VEf05Hok
        
      2. 예) 응답 Header 에 아래 형태로 JWT 전달
    5. Client 에서 JWT 저장 (쿠키, Local storage 등)
  2. Client 에서 JWT 통해 인증방법
    1. JWT 를 API 요청 시마다 Header 에 포함
      Content-Type: application/json
      **Authorization: Bearer** **<JWT>
      ...**
      
    2. 예) HTTP Headers
    3. Server
      1. Client 가 전달한 JWT 위조 여부 검증 (Secret Key 사용)
      2. JWT 유효기간이 지나지 않았는지 검증
      3. 검증 성공시,
        1. JWT → 에서 사용자 정보를 가져와 확인
        2. ex) GET /api/products : JWT 보낸 사용자의 관심상품 목록 조회
        3. Client 가 username, password 로 로그인 성공 시
          1. "로그인 정보" → JWT 로 암호화 (Secret Key 사용)
          2. Sample
          3. JWT 를 Client 응답에 전달
            1. JWT 전달방법은 개발자가 정함
              **Authorization: BEARER** <JWT>
              
              ex)
              **Authorization: BEARER** eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzcGFydGEiLCJVU0VSTkFNRSI6IuultO2DhOydtCIsIlVTRVJfUk9MRSI6IlJPTEVfVVNFUiIsIkVYUCI6MTYxODU1Mzg5OH0.9WTrWxCWx3YvaKZG14khp21fjkU1VjZV4e9VEf05Hok
              
            2. 예) 응답 Header 에 아래 형태로 JWT 전달
          4. Client 에서 JWT 저장 (쿠키, Local storage 등)
        4. Client 에서 JWT 통해 인증방법
          1. JWT 를 API 요청 시마다 Header 에 포함
            Content-Type: application/json
            **Authorization: Bearer** **<JWT>
            ...**
            
          2. 예) HTTP Headers
          3. Server
            1. Client 가 전달한 JWT 위조 여부 검증 (Secret Key 사용)
            2. JWT 유효기간이 지나지 않았는지 검증
            3. 검증 성공시,
              1. JWT → 에서 사용자 정보를 가져와 확인
              2. ex) GET /api/products : JWT 보낸 사용자의 관심상품 목록 조회

 

# JWT 구조

  • JWT 는 누구나 평문으로 복호화 가능
  • 하지만 Secret Key 가 없으면 JWT 수정 불가능
  • → 결국 JWT 는 Read only 데이터
  1. Header
  2. { "alg": "HS256", "typ": "JWT" }
  3. Payload
  4. { "sub": "1234567890", "username": "카즈하", "admin": true }
  5. Signature
  6. HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)

 

 

'❤️‍🔥TIL (Today I Learned)' 카테고리의 다른 글

[TIL] 2022-12-20(37day)  (0) 2022.12.20
[TIL] 2022-12-19(36day)  (0) 2022.12.19
[TIL] 2022-12-14(34day)  (0) 2022.12.15
[TIL] 2022-12-14(33day)  (1) 2022.12.14
[TIL] 2022-12-13(32day)  (0) 2022.12.14

댓글