웹개발
JWT
rangrangerang
2019. 7. 12. 17:23
PART 0 |
토큰(Token)기반 인증 |
- 기존의 세션 기반 인증과는 다르게 서버가 사인한 토큰을 이용하여 인증을 수행하는 방식.
1# 특징
- Stateless 서버 : 서버의 상태를 유지하지 않음(<-> Stateful 서버)
=> 클라이언트-서버 사이에 연결고리가 없음
=> 서버의 확장성이 높아짐
- 모바일 어플리케이션에 적함 : 안전한 API를 만들기 위해 토큰 기반 인증을 사용함
- 인증정보를 다른 어플리케이션으로 전달 : 페이스북/구글 같은 소셜 계정들을 이용하여 다른 웹서비스에서도 로그인 할 수 있음(ex. OAuth)
- 보안 : 토큰 기반 인증 시스템을 사용하여 어플리케이션의 보안을 높일 수 있다.
2# 토큰 기반 시스템의 작동 원리
- 유저가 아이디와 비밀번호로 로그인을 한다.
- 서버측에서 해당 계정정보를 검증한다.
- 계정정보가 정확하다면, 서버측에서 유저에게 signed토큰을 발급해준다.
- 클라이언트 측에서 전달받은 토큰은 저장해두고, 서버에 요청을 할 때 마다 해당 토큰을 함께 서버에 전달한다.
- 서버는 토큰을 검증하고, 요청에 응답한다.
=> 웹서버에서 토큰을 서버에 전달할때에는 HTTP요청의 헤더에 토큰값을 포함시켜서 전달한다.
PART 1 |
JWT란? |
- JWT(JSON Web Token) : 토큰 기반 인증 시스템의 구현체
- 웹표준(RFC 7519)으로서 두 개체에서 JSON객체를 사용하여 가볍고 자가수용적(self-contained)인 방식으로 정보를 안정성있게 전달해준다.
- 자가수용적(self-contained) : JWT는 필요한 모든 정보를 자체적으로 지니고 있다. (토큰에 대한 기본정보, 절달할 정보, 토큰이 검증됐다는것을 증명해주는 signature)
=> 두 개체 사이에서 손쉽게 전달 될 수 있다. (웹서버의 경우 HTTP 헤더에 넣어서 전달 할 수도 있고, URL의 파라미터로 전달 할 수도 있다.)
1# 구성
header.payload.signature |
header : 토큰의 타입과 해시 암호화 알고리즘을 구성되어 있다.
{ "typ": "JWT", "alg": "HS256" }
- payload : 토큰에 담을 클레임(claim)정보를 포함하고 있다. name/value의 한 쌍으로 이루어져 있어 여러개의 클레임들을 넣을 수 있다.
- ex. userId, expire, scope 등 - signature : secret key를 포함하여 암호화되어 있다.
=> payload에 실린 정보가 위변조 되지 않았는지 체크
2# 예시
- 회원인증
- 사용자가 id와 password를 입력하여 로그인을 시도한다.
- 서버는 요청을 확인하고 secret key를 통해 Access token을 발급한다.
- 이후 JWT가 요구되는 API를 요청할 때는 클라이언트가 Authorization header에 Access token을 담아서 보낸다.
- 서버는 JWT Signature를 체크하고 Payload로부터 user정보를 확인해 데이터를 리턴한다.
- 정보교류 : 두 개체 사이에서 안정성있게 정보를 교환할 때 사용한다. 정보가 sign이 되어있기 때문에 정보를 보낸이가 바뀌진 않았는지, 정보가 도중에 조작되지는 않았는지 검증할 수 있다.
[Reference] https://velopert.com/2350 https://velopert.com/2389 https://velog.io/@geuni1013/JWT-%EC%A0%95%EB%A6%AC-%EA%B0%9C%EC%9D%B8%EC%A0%95%EB%A6%AC https://jwt.io/ https://medium.com/@mayurkambariya/jwt-authentication-with-angular-7-14aaa8e3fa33 https://blog.outsider.ne.kr/1160 https://artoria.us/25