Coding/JSON

[Security] - 보안을 위한 JWT (JSON Web Token)란?

잇뉴얼 2022. 6. 26. 14:12
728x90
반응형

[Security] - 보안을 위한 JWT (JSON Web Token)란?


JWT란?
▶ JSON 객체를 사용해 정보를 안정성 있게 전달하는 웹표준

기존에 웹 개발을 하면서 보안에 대한 신경을 쓰지않고, DB에 Password를 그대로 저장해 데이터가 일치하는지만 확인을 해서 로그인을 할 수 있도록 코드를 구현했었습니다. 물론, 혼자 학습용으로 만드는것이기 때문에, 보안에 신경을 쓸 필요가 없지만, 만일 서비스를 하게 된다면, 보안 신경안쓰고 개발을 했을경우, 개발자가 Password를 볼 수 있다는 점과, 데이터 전달중 정보를 빼낼수 있다는 점에서 아주 위험한 상태로 놔두는것과 같게되겠죠. 그래서 JWT를 사용해서 중요한 정보를 보안해주게 됩니다.

▶ JWT 토큰 구성

구성 설명
Header 토큰의 타입과 해시 암호화 알고리즘으로 구성
Payload 토큰에 담을 클레임(claim)정보를 포함
- 클레임이란?
>> Payload에 담는 정보의 한 '조각', name / value의 한쌍으로 이뤄짐
- 클레임의 종류
>> 등록된 (registered) 클레임
>> 공개 (public) 클레임
>> 비공개 (private) 클레임
Signature secret key 포함하여 암호화
▶ JWT 코드 예시 - (로그인)

■ 전체 코드를 구현한 것이 아닌, 일부 코드줄을 가져온것입니다.

# JWT 패키지를 사용합니다. (설치해야할 패키지 이름: PyJWT)
import jwt

# JWT토큰을 만들 떄 필요한 비밀 문자열
SECRET_KEY = '비밀문자열 정의'

# password 보안화
pw_hash = hashlib.sha256(pw_receive.encode('utf-8')).hexdigest()

# 로그인시 JWT 토큰 만들어 발급
payload = {
    'id': id_receive,
    'exp': datetime.datetime.utcnow() + datetime.timedelta(seconds=50000)
}
# pycharm에서 사용시
token = jwt.encode(payload, SECRET_KEY, algorithm='HS256')

# 우분투 서버에서 사용시
# token = jwt.encode(payload, SECRET_KEY, algorithm='HS256').decode('utf-8')

# token 전달
return jsonify({'result': 'success', 'token': token})

# 유저 정보를 확인하기 위한 토큰 확인
# token을 시크릿키로 디코딩 합니다.
payload = jwt.decode(token_receive, SECRET_KEY, algorithms=['HS256'])
▶ JWT 장정 & 단점
장점
  • 사용자 인증에 필요한 모든 정보는 토큰 자체에 포함, 별도의 인증 저장소가 필요없음
  • 쉬운 인증 및 인가 방법을 제공
  • 트래픽 대한 부담이 낮음
  • REST 서비스로 제공 가능
  • 내장된 만료 기능
단점
  • 클라이언트에 저장되어있기에, DB에서 정보를 수정해도 토큰에 직접 적용 불가
  • 더 많은 필드가 추가되면 토큰이 커질수 있음
  • JWT의 크기가 상대적이기 떄문에, 쿠키에 JWT을 담을 경우 오버헤드 발생 가능성 있음
반응형