JWT(Json Web Token)
- 데이터를 안전하고 간결하게 전송하기 위해 고안된 토큰 인증 방식
- JSON 포맷의 토큰 정보를 인코딩 후, 인코딩된 토큰 정보를 Secret Key로 서명한 메시지를 Web Token으로써 인증 과정에 사용
- JWT : https://jwt.io/
JWT 종류
- Access Token
- 보호된 정보들(사용자의 연락처, 사진 등)에 접근할 수 있는 권한을 부여받는 데에 사용된다.
- 비교적 짧은 유효기간 - Refresh Token
- Access Token의 유효기간이 만료되면, Refresh Token을 사용해 새로운 Access Token을 발급받는다.
- 비교적 긴 유효기간
JWT 구조
- header
어떤 종류의 토큰이고 어떤 알고리즘으로 Sign할지 JSON 포맷 형태로 정의하고, base64 방식으로 인코딩
- payload
사용자의 정보, 어떤 정보에 접근 가능한지에 대한 권한 정보를 JSON 포맷 형태로 정의하고, base64 방식으로 인코딩
* 토큰이 탈취되어, 디코딩될 수 있으므로 민감한 정보는 담지 않는 것이 좋다.
- Signature
원하는 비밀키와 Header에서 지정한 알고리즘을 이용해 Header와 Payload에 대해 단방향 암호화를 수행
토큰 기반의 인증 절차
- 클라이언트가 서버에 id, password를 담아 로그인 요청
- 서버가 id, password가 일치하는지 확인 후, 암호화된 토큰을 생성
- Access Token, Refresh Token을 모두 생성(두 토큰이 같은 정보를 담을 필요는 없음) - 토큰을 클라이언트에게 전송하고, 클라이언트는 토큰을 저장
- 저장 위치는 Local Storage, Session Storage, Cookie 등 - 클라이언트가 HTTP Header(Authorization Header) 또는 Cookie에 토큰을 담아 Request 전송
- Bearer authentication 이용
https://learning.postman.com/docs/sending-requests/authorization/#bearer-token
https://tools.ietf.org/html/rfc6750 - 서버가 토큰을 검증한 후, 클라이언트의 Request 처리하고 Response 전송
장점
- 상태를 유지하지 않고, 확장에 용이한 애플리케이션을 구현하기 좋음(Stateless, Scalable)
- 클라이언트가 Request를 전송할 때마다 자격 증명 정보를 전송할 필요가 없음
- 인증 담당 시스템을 다른 플랫폼으로 분리하는 것이 용이
- 권한 부여에 용이
단점
- 토큰이 탈취되어, Payload가 디코딩될 수 있음
- 토큰 길이가 길어지면, 네트워크에 부하를 줄 수 있음
- 토큰은 자동으로 삭제되지 않음
JWT 생성 및 검증 테스트
https://github.com/bangjaeyoung/jwt-practice
- Stick Session : https://www.imperva.com/learn/availability/sticky-session-persistence-and-cookies/
- Session Clustering : https://zetawiki.com/wiki/%EC%84%B8%EC%85%98_%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0%EB%A7%81 / https://tomcat.apache.org/tomcat-8.5-doc/cluster-howto.html
- jjwt : https://github.com/jwtk/jjwt
- Java JWT : https://github.com/auth0/java-jwt
- OAuth2 Social Login Guide : https://deeplify.dev/back-end/spring/oauth2-social-login
- Spring Security + JWT + Redis - Login Guide : https://kobumddaring.tistory.com/60
- Why need Refresh Token in JWT : https://velog.io/@park2348190/JWT%EC%97%90%EC%84%9C-Refresh-Token%EC%9D%80-%EC%99%9C-%ED%95%84%EC%9A%94%ED%95%9C%EA%B0%80
'Develop > Spring' 카테고리의 다른 글
JWT - Secret Key를 시스템 환경 변수로 등록할 때 주의점 (0) | 2022.11.25 |
---|---|
Spring Security + JWT 적용 (로그인 인증, 자격 증명, 검증 구현) (0) | 2022.11.25 |
Spring Security에서 지원하는 표현식(Spring EL) (0) | 2022.11.22 |
Spring Security 권한 부여 처리 흐름 (0) | 2022.11.22 |
Spring Security 인증 처리 흐름 (0) | 2022.11.21 |