01. JWT
- JWT는 웹 표준으로서, 정보를 안전하게 전송하기 위해 사용되는 토큰 기반의 인증 방식
- 주로 인증과 정보 교환에 사용되며, 특히 클라이언트와 서버 간의 인증을 간단하게 구현할 때 많이 사용된다.
- JWT는 JSON 객체를 사용하여 정보를 표현하며, 세 부분으로 구성된다.
- Header(헤더): JWT의 유형과 해싱 알고리즘을 지정. 일반적으로 알고리즘과 토큰유형이 포함된다.
- Payload(페이로드): 클레임이라고도 불리며 이는 이름과 값의 쌍으로 이루어진다. 일반적으로 클레임은 registered, public, private으로 나눠진다. registered는 토큰의 정보를 표현하기 위해 미리 정의된 클레임이고, public은 충돌을 방지하기 위해 사용된다. private은 사용자 정의 정보를 담기 위해 사용된다.
- Signature(서명): 토큰의 무결성을 보장하기 위해 생성된 서명이다. 서명은 헤더,페이로드,시크릿 키를 이용하여 생성된다.
02. JWT 보안 강화하기
- 토큰 유효 기간 설정: JWT 토큰은 유효 기간을 가지며, 보통 짧은 기간으로 설정하는 것이 좋다. 수명을 짧게 하면 오랫동안 악용될 가능성을 줄여준다.
- HTTPS 사용: JWT 토큰을 전송할 떄는 항상 HTTPS를 사용하여 암호화된 연결을 통해 통신하는 것이 중요하다. 이는 토큰이 도청되는 것을 방지하고 중간자 공격을 방어할 수 있다.
- JWT 페이로드 내용 제한: 토큰의 페이로드에는 민감한 정보를 담지 않도록 해야 한다. 필요한 최소한의 정보만 포함시키고, 중요한 정보는 토큰이 아닌 서버에서 따로 관리하는 것이 좋다.
- 서명 알고리즘 선택: JWT는 서명된 토큰으로 서명 알고리즘을 고려해야 한다. 일반적으로는 HMAC SHA256 또는 RSA 알고리즘을 사용한다. 강력한 서명 알고리즘을 선택하여 토큰의 변조를 방지한다.
- 토큰 저장소 보아니 클라이언트 측에서 JWT를 저장하는 경우, 보안에 유의해야 한다. 웹 어플리케이션에서는 쿠키보다는 HttpOnly 속성을 설정한 HTTP 헤더를 통해 쿠키에 저장하는 것이 보안성을 높일 수 있다.
- 재발급과 토큰 갱신: 만약 토큰이 탈취되거나 보안상의 위험이 발생하면, 재발급 메커니즘을 구현하여 새로운 토큰을 발급하고 이전 토큰을 무효화시키는 절차를 수행해야 한다. (Refresh token 이용)
- 2단계 인증(2FA) 적용: 보안 수준을 높이기 위해 2단계 인증을 도입하는 것이 좋다. 추가적인 인증 단계를 거치므로 토큰 만으로는 접근이 불가능해진다.
- JWT 검증 및 검증 오류 처리: 서버는 수신한 JWT 토큰의 유효성을 검증해야 하며, 유효하지 않은 토큰에 대한 오류 처리를 잘 구현해줘야 한다.
- 보안 업데이트와 모니터링: 보안에 취약한 부분이 발견되거나 새로운 취약점이 보고된 경우, 시스템을 업데이트하고 모니터링하여 보안 상태를 지속적으로 관리해야 한다.
- JWT 대안 검토: JWT가 항상 최선의 선택은 아닐 수 있다. 사용 사례와 요구 사항에 따라 다른 인증 방법을 검토하여 적합한 메커니즘을 선택하는 것이 중요하다.
==> But, 보안은 항상 변화하고 발전하므로 새로운 취약성에 대비하여 최신 보안 모범 사례를 따라야 한다.
'JavaScript Dev. > Node.js' 카테고리의 다른 글
artillery를 이용한 서버 부하 테스트 (0) | 2023.08.06 |
---|---|
Helmet 모듈이란?? (0) | 2023.07.21 |
node-cron란?? (feat. cron) (0) | 2023.06.21 |
카카오 소셜 로그인(feat. passport-kakao, jwt) (0) | 2023.06.12 |
AWS EC2를 이용해 HTTPS 배포 (feat. 가비아) (2) | 2023.06.02 |