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을 담을 경우 오버헤드 발생 가능성 있음
반응형