-
Spring Security JWT - 1. JWT에 대해Spring Security/jwt 2023. 11. 20. 15:38728x90
- JWT란
- JSON Web Token의 약자로 암호화된 Token을 Json 형태로 만든 것.
- Claim 방식을 사용하는데, Oauth처럼 Token을 받고 서버에서 권한을 확인해 처리하는 방식이 아닌 Claim 이란 곳에 사용자에 대해 권한과 같은 여러 정보 (개인정보 X)가 들어있어, 서버에서 사용자를 검색하고, 권한을 찾는 일을 할 필요가 없다고 한다.
- 인증과 인가가 한번에!
- 전에 했던 Spring security의 session 방식으로 로그인 사용자를 관리하는 것이 아닌 로그인 사용자에게 token을 주고 그 토큰이 유효한 토큰인지 확인하여 동작하는 방식으로 사용된다고 한다.
- 배경?
- 서버에 저장되어 관리하는 Session방식은 사용자가 많아질수록 Session에 저장되는 정보량이 많아져 성능에 문제를 줄 수 있다고 한다.
- Session을 사용하여 서버에서 사용자의 정보를 가지고 있는 것은 Stateless 하지 못하다.
- JWT방식은 claim데이터와 식별데이터를 모두 클라이언트에 주고 서버에서는 어느 사용자던 상관없이 검증, 인가만 하면 되기 때문에 Stateless 하다.
- WEB에서 RestFul 하게 API를 설계하는데, Rest API란 자원을 Stateless 하게 관리하기 위한 방식이다
- 사용자 정보도 위와 같이 Stateless하게 관리하기 위해 Sesstion 방식이 아닌 Cookie에 저장하는 JWT를 사용한다고 한다.
- 생김새
https://medium.com/@sureshdsk/how-json-web-token-jwt-authentication-works-585c4f076033
- HEADER, PAYLOAD, SIGNATURE 3가지로 나눠지고, 3개는 점(.)으로 연결되어 있다.
- HEADER에서는 SIGNATURE의 암호화 방식을 명시하는 alg와, JWT방식이다라는 것을 명시하는 typ이 있다.
- PAYLOAD에는 여러 가지 정보가 담겨있다.
- sub : 토큰 제목.
- iss : 토큰 발급자.
- aud : 토큰 대상자.
- exp : 토큰 만료시간, NumericDate 형식으로 되어있다.
- iat : 토큰 발급시간
- 등등 있고, Custom으로 더 넣을 수 있다고 한다.
- SIGNATURE는 토큰의 변조를 막기 위해 PAYLOAD에 저장된 데이터를 서버 설정에 맞춰 암호화한다고 한다. 그래서 데이터가 변조가 되었을 경우 해당 SIGNATURE와 맞지 않기 때문에 무결성을 유지할 수 있다고 한다. SIGNATURE 값까지 같이 변조를 할 수 있으나, 서버의 암호키가 있기 때문에 만들 수 없다.
- 단점, 유의할 점
- 서버에 사용자의 정보를 가지고 있지 않기 때문에, 공격자가 해당 토큰을 탈취하여 사용해도 해킹인지 알 수 없다. 해킹인지 알 수 있게 되더라도 강제로 만료시킬 수 없다.
- Set Cookie에서 HttpOnly를 사용하여 xss공격을 막는다. (Header에 넣어 전달해도 된다)
- 토큰의 유효시간을 짧게 가져가서 토큰이 탈취되어도 금방 막히도록 설정한다.
- secure 설정을 하여 Https 일 때만 Cookie를 전송하도록 한다.
- 토큰 발급요청 시 클라이언트의 고유값(MAC Address, IMEI 등)을 payload 에 넣고, 클라이언트에서 요청시 해당 고윳값이 일치하는지 확인한다.
- Payload 자체가 암호화되지 않아 개인정보를 넣으면 안 된다.
- 토큰의 정보가 많을수록 길이도 길어지기 때문에 인증 요청 시마다 부하가 심해질 수 있다.
- 서버에 사용자의 정보를 가지고 있지 않기 때문에, 공격자가 해당 토큰을 탈취하여 사용해도 해킹인지 알 수 없다. 해킹인지 알 수 있게 되더라도 강제로 만료시킬 수 없다.
728x90반응형LIST'Spring Security > jwt' 카테고리의 다른 글
Spring security JWT - 6. IUWT방식을 이용하여 방어하기 (0) 2023.12.03 Spring security JWT - 5. JWT토큰을 어디에 넣어 전달하는 것이 좋을까? (1) 2023.11.21 Spring security JWT - 4. RefreshToken으로 갱신하기 (1) 2023.11.20 Spring security JWT - 3. Token 검증하기 (1) 2023.11.20 Spring security JWT - 2. JWT token 발급하기 (1) 2023.11.20 - JWT란