JWT
2021, Feb 23
JWT란
JWT는 JSON Web Token의 약자로, JSON 데이터 구조를 암호화하는 방법으로 RFC7516 표준이다.
주로 인증을 위해 사용되고, 보안을 위해 데이터 변환을 하는데도 사용된다.
JWT는 세 부분으로 나뉘며, 각 파트마다 .을 통해 나누어진다. 맨 앞에서부터 순서대로
header, payload, sinature로 구분된다.
- header : 토큰의 타입과 해시 암호화 알고리즘으로 구성되어 있다. 첫째는 토큰의 유형 (JWT)를 나타내고, 두 번째는 HMAC, SHA-256, RSA와 같은 해시 알고리즘을 나타낸다.
- payload : 토큰에 담을 정보를 포함하고 있다. 사용자의 구분이 가능하도록 사용자의 정보나 토큰의 만료기간을 담는다.
- sinature : header, payload를 인코딩한 값을 합친 뒤, secret key를 통해 해시한다.
JWT 설치 및 사용
위 명령어를 통해 jwt를 설치한다.
jwt.sign() 메소드를 통해 토큰을 생성할 수 있다. 함수에 들어가는 인자는 다음과 같다.
- userinfo: 아이디, 비밀번호 등 사용자 정보가 들어간 객체. 비밀번호는 위험하니 아이디를 넣는걸 권장한다.
- secretKey: 여러가지 복잡한 문자열로 된 키. 임의의 복잡한 문자열을 키로 정한다.
- options: 토큰에 대한 여러가지 정보를 설정한다. expiresin은 토큰 만료일. issuer, subject는 토큰에 대한 정보이다. 그 외에 option도 존재한다.
- 익명함수: token을 콜백함수로 받을 수 있으므로 주로 token을 프론트단에 json형식으로 응답하는 코드를 작성한다.
사용자는 서버에게 요청을 보낼 때, request.Header에 토큰을 포함하여 요청을 보낸다. 위의 코드에서는
프론트에서 x-auth-token이라는 이름으로 header에 token을 포함시켜 요청을 보내왔기에 token을 header에서 가져온 모습이다.
jwt.verify()는 검증과 동시에 token의 decode된 결과를 json 형식으로 반환한다.
jwt.verify() 메소드를 통해 토큰의 유효성을 검사할 수 있다. 함수에 들어가는 인자는 다음과 같다.
- token: client에서 받은 token
- secretkey: token 생성 시 사용했던 secret key
- 익명함수: 유효성 검사 결과를 처리할 콜백함수. decode된 token을 json 형식으로 decoded라는 인자에 받을 수 있다.
JWT 장단점
장점
- 사용자 인증에 필요한 정보는 토큰에 포함하므로, 별도의 인증 저장소 필요 X
- 분산 마이크로 서비스 환경에서 인증 서버와 DB에 의존하지 않는 쉬운 인증 방법
- 트래픽에 대한 부담이 낮다
- REST 서비스로 제공 가능
- 내장된 만료기간
단점
- 토큰은 클라이언트에 저장되어 DB에서 사용자 정보를 변경해도 반영할 수 없다.
- 더 많은 필드가 추가되면 토큰이 커질 수 있다.
Reference
http://www.opennaru.com/opennaru-blog/jwt-json-web-token/
https://helloinyong.tistory.com/111