세션 대신 JWT를 사용하기 위해 각종 코드를 적용하면서 코드를 그대로 가져오려니 이해안되는 부분이 많았다.
코드도 복잡하고 동작 과정도 모르는 상태로 사용하려니 JWT 형식 변경이나 유지보수에 어려움이 있을게 뻔해서
자주 볼 수 있게 정리해보려고 한다.
참조
https://blog.javabom.com/minhee/session/spring-security-1/spring-security
https://bcp0109.tistory.com/301
JWT 적용을 위해 봤던 코드 및 로직들
1. Why JWT?
JWT의 특징
- 사용자 인증에 필요한 모든 정보를 토큰에 담아 클라이언트(React)에 저장하기 때문에 별도의 DB 테이블이 필요 없다. <-> 일반 토큰과의 가장 큰 차이점
- 분산 마이크로 서비스 환경에서 클레임 토큰은 중앙 집중 인증 서버와 DB에 의존하지 않는 쉬운 인증 서비스를 제공하여 사용하기가 편리하다.
- 클라이언트와 서버가 통신할 때 인증 정보를 서버 세션에 저장하는 방식이 아닌 클라이언트가 가진 정보를 받아 파싱하여 비교하는 방식이기 때문에 서버의 세션 관리에 따른 부하가 발생하지않고 CORS문제가 발생하지 않는다. -> 사실 이게 JWT를 선택한 가장 큰 이유다.
- 인증 서비스의 개방형 표준 프로토콜인 OAuth 2.0에서 인증 토큰으로 JWT를 사용하기 때문에 사용자가 서드 파티 앱에 접근 권한을 부여하는 매커니즘을 제공한다.
위 특징을 바탕으로 생각해봤을 때 JWT 인증 방식을 공부해두면 나중에 SNS 로그인이나 네이버 로그인 같은 외부 인증 서비스 도입 시에도 좋을거라고 생각했다.
또한 현재 마이크로 서비스가 대새로 자리잡고 있고 해당 서비스에서 사용하기에 가장 적합한 인증 방식이 JWT이기 때문에 프로젝트에 적용해 보았다.
2. JWT 구조
JWT는 Header, Payload, Signature 세 부분으로 구성되어있다.

- Header
- 어떤 알고리즘으로 암호화할 것인지 어떤 토큰을 사용할지에 대한 정보가 들어있다.
- Payload
- 전달하려는 정보가 들어있다.
- 커스터마이징이 가능하기 때문에 원하는 정보들을 모두 넣을 수 있다.
- 노출됐을 때 수정이 가능하기 때문에 인증에 필요한 최소한의 정보만 담는 것이 좋다.
- Signature
- Header와 Payload를 합친 후 서버에서 정한 Secret Key로 암호화시킨 것이다.
- Signature를 파싱하여 나온 정보와 Header, Payload 정보를 비교하여 수정여부를 판별한다.
3. JWT 동작 과정
- 스프링 Security 과정을 모두 담기에는 내용이 방대하여 여기서 확인해보면 좋을 것 같다.
JWT 인증 과정
JWT를 이용한 스프링 Security

- JwtFilter라는 커스텀 필터를 생성하여 스프링 Security의 AuthenticationFilter 앞에 넣는다.
- 해당 필터에서 JWT의 존재 여부와 유효 여부를 판별한다.
- 로그인 시도 시 스프링 Security를 통해 인증이 완료되었다면 JwtFilter에서 Authentication과 User 객체를 바탕으로 JWT를 생성하여 클라이언트에게 반환한다.
- 인증 필요 자원에 접근 시 JwtFilter에서 클라이언트에게 받은 토큰을 파싱하고 올바른 형식인지 판별하여 필터를 진행시키거나 예외를 던져 클라이언트에게 알려준다.

4. JWT 인증 간단 흐름

- username과 password 등으로 클라이언트 로그인 요청이 들어온다.
- 스프링 Security를 통해 인증이 완료되면 JWT 형식의 토큰이 클라이언트에게 발급된다.
- 클라이언트는 해당 토큰을 헤더에 Bearer 타입으로 넣어 서버에게 보낸다.
- 서버는 해당 토큰을 위 스프링 Security + JWT 인증 필터 체인에 넣어 권한을 확인한다.
출처
1. http://www.opennaru.com/opennaru-blog/jwt-json-web-token/
2. https://jwt.io/introduction
3. https://brunch.co.kr/@jinyoungchoi95/1
4. https://80000coding.oopy.io/1f213f10-185c-4b4e-8372-119402fecdd0
'Dev > Spring' 카테고리의 다른 글
Spring Cloud Eureka Swagger 연결하기 (3) | 2024.04.15 |
---|---|
JWT 리프레시 토큰 Cookie에 저장하기 (2) | 2024.03.28 |
Private 메소드 테스트 고민 (1) | 2024.03.17 |
세션과 CORS 문제 (1) | 2024.03.10 |
스프링 시큐리티 Session 인증 + React 로그인 문제 (2) | 2024.03.10 |
세션 대신 JWT를 사용하기 위해 각종 코드를 적용하면서 코드를 그대로 가져오려니 이해안되는 부분이 많았다.
코드도 복잡하고 동작 과정도 모르는 상태로 사용하려니 JWT 형식 변경이나 유지보수에 어려움이 있을게 뻔해서
자주 볼 수 있게 정리해보려고 한다.
참조
https://blog.javabom.com/minhee/session/spring-security-1/spring-security
https://bcp0109.tistory.com/301
JWT 적용을 위해 봤던 코드 및 로직들
1. Why JWT?
JWT의 특징
- 사용자 인증에 필요한 모든 정보를 토큰에 담아 클라이언트(React)에 저장하기 때문에 별도의 DB 테이블이 필요 없다. <-> 일반 토큰과의 가장 큰 차이점
- 분산 마이크로 서비스 환경에서 클레임 토큰은 중앙 집중 인증 서버와 DB에 의존하지 않는 쉬운 인증 서비스를 제공하여 사용하기가 편리하다.
- 클라이언트와 서버가 통신할 때 인증 정보를 서버 세션에 저장하는 방식이 아닌 클라이언트가 가진 정보를 받아 파싱하여 비교하는 방식이기 때문에 서버의 세션 관리에 따른 부하가 발생하지않고 CORS문제가 발생하지 않는다. -> 사실 이게 JWT를 선택한 가장 큰 이유다.
- 인증 서비스의 개방형 표준 프로토콜인 OAuth 2.0에서 인증 토큰으로 JWT를 사용하기 때문에 사용자가 서드 파티 앱에 접근 권한을 부여하는 매커니즘을 제공한다.
위 특징을 바탕으로 생각해봤을 때 JWT 인증 방식을 공부해두면 나중에 SNS 로그인이나 네이버 로그인 같은 외부 인증 서비스 도입 시에도 좋을거라고 생각했다.
또한 현재 마이크로 서비스가 대새로 자리잡고 있고 해당 서비스에서 사용하기에 가장 적합한 인증 방식이 JWT이기 때문에 프로젝트에 적용해 보았다.
2. JWT 구조
JWT는 Header, Payload, Signature 세 부분으로 구성되어있다.

- Header
- 어떤 알고리즘으로 암호화할 것인지 어떤 토큰을 사용할지에 대한 정보가 들어있다.
- Payload
- 전달하려는 정보가 들어있다.
- 커스터마이징이 가능하기 때문에 원하는 정보들을 모두 넣을 수 있다.
- 노출됐을 때 수정이 가능하기 때문에 인증에 필요한 최소한의 정보만 담는 것이 좋다.
- Signature
- Header와 Payload를 합친 후 서버에서 정한 Secret Key로 암호화시킨 것이다.
- Signature를 파싱하여 나온 정보와 Header, Payload 정보를 비교하여 수정여부를 판별한다.
3. JWT 동작 과정
- 스프링 Security 과정을 모두 담기에는 내용이 방대하여 여기서 확인해보면 좋을 것 같다.
JWT 인증 과정
JWT를 이용한 스프링 Security

- JwtFilter라는 커스텀 필터를 생성하여 스프링 Security의 AuthenticationFilter 앞에 넣는다.
- 해당 필터에서 JWT의 존재 여부와 유효 여부를 판별한다.
- 로그인 시도 시 스프링 Security를 통해 인증이 완료되었다면 JwtFilter에서 Authentication과 User 객체를 바탕으로 JWT를 생성하여 클라이언트에게 반환한다.
- 인증 필요 자원에 접근 시 JwtFilter에서 클라이언트에게 받은 토큰을 파싱하고 올바른 형식인지 판별하여 필터를 진행시키거나 예외를 던져 클라이언트에게 알려준다.

4. JWT 인증 간단 흐름

- username과 password 등으로 클라이언트 로그인 요청이 들어온다.
- 스프링 Security를 통해 인증이 완료되면 JWT 형식의 토큰이 클라이언트에게 발급된다.
- 클라이언트는 해당 토큰을 헤더에 Bearer 타입으로 넣어 서버에게 보낸다.
- 서버는 해당 토큰을 위 스프링 Security + JWT 인증 필터 체인에 넣어 권한을 확인한다.
출처
1. http://www.opennaru.com/opennaru-blog/jwt-json-web-token/
2. https://jwt.io/introduction
3. https://brunch.co.kr/@jinyoungchoi95/1
4. https://80000coding.oopy.io/1f213f10-185c-4b4e-8372-119402fecdd0
'Dev > Spring' 카테고리의 다른 글
Spring Cloud Eureka Swagger 연결하기 (3) | 2024.04.15 |
---|---|
JWT 리프레시 토큰 Cookie에 저장하기 (2) | 2024.03.28 |
Private 메소드 테스트 고민 (1) | 2024.03.17 |
세션과 CORS 문제 (1) | 2024.03.10 |
스프링 시큐리티 Session 인증 + React 로그인 문제 (2) | 2024.03.10 |