슈코딩

[Django] DRF 이용한 JWT사용 본문

코딩공부/Django

[Django] DRF 이용한 JWT사용

Roshu 2022. 7. 14. 00:58

 

 

오늘은 JWT토큰을 발급해서 로그인하는 방식으로 django로 넘어오면서 처음 사용하게 되어서 강의때 배웠던 내용들을 간단하게 정리해보려고 한다.

 

기존에 사용했던 인증 방식 : 세션 인증

 

이번에 사용한 인증 방식 : 토큰 인증

 

#세션인증

기본적으로 브라우저에서 사용자가 인증을 수행하면 서버에서는 사용자의 정보를 저장하고, 그 응답으로 JSESSIONID 라는 키를 이용해 클라이언트(사용자) 브라우저의 쿠키에 세션의 정보를 저장하게됨. 이후 클라이언트는 브라우저 쿠키에 저장된 JSESSIONID 로 저장된 세션 정보를 이용해 인가(Authorization)된 정보에 접근 할 수 있게 된다.

 

#토큰인증

토큰인증 방식은 사용자가 인증을 수행하면 서버에서는 토큰을 생성한 뒤에 저장하지 않고 토큰값을 사용자의 브라우저에게 응답한다. 이 토큰값을 사용자가 인가된 사용자만 사용할 수 있는 서비스를 요청할  때 함께 보내게 되고, 서버에서 이 토큰을 의미있는 값으로 해석하게 된다. 그리고 이 값으로 사용자를 인증하게 된다. 토큰은 사용자를 설명할 수 있는 데이터를 포함한다. 이를 클레임(claim) 이라고 한다.

 

#JWT 토큰

토큰 인증 방식의 대표주자이다. JWT 토큰 구조는 Header.Payload.Verify_Signature 로 이루어져 있으며, 각 데이터는 온점(.)으로 구분된다.

예시) 

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

 

#Header

Header: JWT를 검증하는데 필요한 정보를 가진 데이터

Verify_Signature에 사용한 암호화 알고리즘과 타입, key의 id 등 정보를 가지고 있다.

HEADER 정보
{
  "typ": "JWT",    # 토큰 타입
  "alg": "HS256"   # 알고리즘
}

 

#Payload

Payload: 실질적으로 인증에 필요한 데이터를 저장. 데이터 각각의 필드를 claim이라고 한다.

클레임에는 대부분의 경우 username 또는 user_id를 포함한다. 인증할때 payload에 있는 username을 가져와서 사용자의 정보를 인증할 때 사용하기 때문이다.

PAYLOAD 정보
{
  "token_type": "access", # 토큰의 종류. 여기서는 access 토큰입니다.
  "exp": 1656293275, # 토큰의 만료시간입니다. (Numeric Date)
  "iat": 1656293095, # 토큰의 발행시간입니다. (Numeric Date)
  "jti": "2b45ec59cb1e4da591f9f647cbb9f6a3", # json token id 입니다.
  "user_id": 1 # 실제 사용자의 id값이 들어있습니다.
}

 

#VERIFY SIGNATURE

VERIFY SIGNATURE: Header 와 Payload는 암호화 되지 않고 단순히 Json -> UTF-8 -> Base64 형식으로 변환된 데이터 이다. 즉, 생성 자체는 너무 쉽고 누구나 만들 수 있는 데이터다. 따라서 두가지의 데이터만 존재한다면 토큰에 대한 진위여부 판단이 이루어질수 없게 된다. 그래서 JWT의 구조에서 마지막에있는 Verify Signature은 토큰 자체의 진위여부를 판단하는 용도이다.

VERIFY SIGNATURE 는 Base64UrlEncoding 된  
header 와 payload 의 정보를 합친 뒤 
SECRET_KEY 를 이용하여 Hash 를 생성하여 암호화 한다.

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
	SECRET_KEY
)

 

지난번 유화 프로젝트때 서브기능으로 로그인/회원가입도 같이 하면서 JWT를 이용한 로그인방식으로 구현을 해보았는데, 기능 구현은 워낙에 설명이 잘된 블로그가 많고, 그래서 따라서 구현을 하면 생각했던것보다 쉽게 구현은 됐지만 로그인을 할때 통과하는 TokenObtainPairView와 같은 JWT 내장 함수, 시리얼라이저를 활용하니까 자세히 인증이 구현되는 로직을 파악하는것은 어렵다고 느꼈다. 우선은 JWT가 어떠한 정보를 담고 있는지, 무엇을 사용하여 인증을 하는지, JWT를 사용하면 왜 좋은지에 대하여 고민해보고 공부하는 시간을 갖도록 해야겠다.

'코딩공부 > Django' 카테고리의 다른 글

[Django] Q() 객체 Query 활용  (0) 2022.06.28
[Django] DRF의 꽃 Serializer  (0) 2022.06.24
[Django] Admin 페이지 커스텀  (0) 2022.06.24
[Django] DRF 특강 2,3일차 기본 개념 정리  (0) 2022.06.20
[Django] DRF 특강 1일차  (0) 2022.06.15
Comments