JWT 개념 학습
1. JWT(Json Web Token) 개요
- Json 객체에 인증에 필요한 정보들을 담은 후 비밀키로 서명한 토큰으로 인터넷 표준 인증 방식
- 인증(Authentication) & 권한 허가(Authorization)
- 한 번 통신이 시행된 후에 연결이 끊어지고, 다시 연결해도 이전 상태가 유지되지 않는 HTTP의 특성으로 매번 사용자 인증을 하기는 효율성 🔽 → 인증된 사용자가 일정 기간 동안 재인증을 하지 않아도 되도록 만든 것이 Acess Token(JWT의 일종)
- 네트워크 부하가 적다는 장점이 있으나, 토큰은 발급되면 만료 기간 변경이 불가능하므로 토큰 만료 처리를 구현해야 함
2. Process
- 로그인
- 사용자가 서버에 로그인 요청
- 서버는 비밀키를 이용해 JWT를 발급
- 발급된 JWT는 헤더에 담겨져 클라이언트로 전송
- 서비스 이용
- 클라이언트의 로컬에 저장된 JWT는 API 호출 시 헤더에 포함하여 전송
- 서버는 헤더를 확인하여 사용자를 확인 후 API 응답
3. Structure
- Header
- alg : Signature에서 사용하는 알고리즘
- typ : 토큰 타입
- 일반적으로 RS256 (RSA Signature with SHA-256), HS256 (HMAC with SHA-256)을 이용
- Payload
- 페이로드를 구성하는 다양한 변수(클레임)이 존재하고, 개발자의 선택에 따라 구성
- 클레임의 충돌을 방지하기 위해 IANA의 표준이 존재
- Signature
- 헤더와 페이로드의 문자열을 합친 후에, 헤더에서 선언한 알고리즘을 이용해 암호한 값
- 암호화에 사용된 key 값은 header에서 선언한 알고리즘에 따라 개인 키 또는 비밀 키를 이용
4. Test
프록시 도구와 아래 사이트를 통해서 실제 서비스에서 사용되는 내 JWT를 확인해보았다.
🛠️ Fiddler Everywhere : 웹 디버깅 프록시 도구
📎 JWT Decoding site : https://jwt.io/
맥북에서 작업하느라 켜놓은 한컴독스 사이트의 POST 패킷을 보면 아래 이미지처럼 refresh_token(JWT의 일종)을 확인할 수 있다.
JWT는 앞서 소개한 헤더, 페이로드, 시그니처를 온점(.)으로 연결하는 형태이다.
이를 복사하여 JWT 디코딩을 돌려보면 아래 같은 결과를 얻을 수 있다.
한컴독스 사이트의 경우 JWT에 사용자의 id와 email, 작성자 권한 등이 포함된 것을 확인할 수 있다.
회원가입 기능 분석
1. JWT 암호화
try:
access_token = create_access_token(user_id)
except mysql.connector.Error as e :
print(e)
cursor.close()
connection.close()
return {"error" : str(e)}, 503 #HTTPStatus.SERVICE_UNAVAILABLE
return {
"result" : "success",
"access_token" : access_token,
"hash password" : hashed_password
}
flask에서 사용 가능한 패키지 중 'flask_jwt_extended' 패키지의 'create_access_token' 메서드를 이용한다.
SQL 에러가 발생하지 않으면 정상적으로 토큰이 발급된다.
2. 이메일 주소 형식 확인
try :
validate_email( data['email'] )
except EmailNotValidError as e:
print(str(e))
return {'error' : str(e) }, 400
이메일 형식을 확인해주는 패키지도 존재한다.
'email_validator' 패키지의 메서드와 에러를 사용하면 쉽게 이메일 형식을 확인하고, 오류를 리턴할 수 있다.
3. 비밀번호의 길이 유효 체크
if len(data['password']) < 4 or len(data['password']) > 12 :
return { "error" : "비밀번호의 길이를 확인해주세요 (4-12자리)" }, 400
비밀번호는 단순하게 json으로 반환되는 password 변수의 길이를 검사하는 식인데,
이 코드를 조금 수정해서 특수문자와 대문자 조건을 추가해보려 한다.
위에서 분석한 코드들은 아래 블로그를 참고한 코드이다.
📎 [Tistory] RESTful flask API - 회원을 DB에 등록하고 로그인을 할 수 있는 기능 구현하기
'Univ' 카테고리의 다른 글
[2023 동계 모각코] 2024-02-05(월) (0) | 2024.02.05 |
---|---|
[2023 동계 모각코] 2024-01-29(월) 결과 (0) | 2024.01.29 |
[2023 동계 모각코] 2024-01-29(월) (0) | 2024.01.29 |
[2023 동계 모각코] 2024-01-22(월) 결과 (0) | 2024.01.22 |
[2023 동계 모각코] 2024-01-22(월) (0) | 2024.01.22 |