본문 바로가기
TIL(Today I Learned)

사이드 프로젝트 JWT 적용 과정 기록

by kkkdh 2023. 2. 26.
728x90

오늘은 주말을 맞아 jwt를 공부할겸, 여러 기술 블로그와 강의를 참고해서 jwt를 공부하고 사이드 프로젝트에 적용해 봤고, 이 내용을 간단하게 기록해보려 합니다.

 

JWT에 대해 잘 정리된 글들과 실습 예시들이 많기 때문에, 그러한 글들을 참고해서 적용한 과정을 이해한 방식과 함께 정리해 보겠습니다.


JWT란?

JWTJSON Web Token의 약자로 클라이언트와 서버 또는 서비스와 서비스 사이의 통신에서 인증 (Authentication) 및 권한 인가(Authorization)을 위해 사용하는 토큰을 의미합니다.

 

JWT는 다음의 세 가지 부분으로 구성됩니다.

  • header: token 서명에 사용되는 알고리즘에 대한 정보가 포함됩니다.
  • payload: 사용자 정보 또는 권한 부여 요청과 같은 전송해야 하는 추가 데이터가 포함됩니다.
  • signature: token의 신뢰성을 확인하고, token이 유효한지 확인하기 위해 사용하는 부분입니다.

이렇게 생겼습니다.

header, payload, signature part는 예시에서 볼 수 있듯이 .(점)을 기준으로 구분합니다.

 

기존의 session-based 인증 방식 대신 JWT를 사용하는 이유는 다음과 같이 정리할 수 있습니다.

  • Statelessness: 인증된 각 사용자에 대한 정보를 서버가 유지해야 하는 기존의 session-based 인증과는 다르게 JWT는 stateless 하게 사용자 정보를 관리합니다. 즉, 서버가 사용자 정보를 저장할 필요가 없어지며, 이는 웹 애플리케이션의 확장과 배포를 더 쉽게 만듭니다.
  • Security: jwt는 서버에서 관리되는 secret key로 서명(signature)하기 때문에, 토큰을 악의적으로 조작하거나 위조하기 어렵게 만듭니다.

이렇게 jwt를 이용하면, session 기반 인증 방식에 비해 다양한 이점을 갖게 됨을 공부할 수 있었습니다.


사이드 프로젝트에 적용해보기

의존성 추가

먼저 이렇게 build.gradle에 의존성을 추가합니다.

 

다음으로 jjwt(Java JSON Web Token) 라이브러리를 이용해 토큰 생성과 유효성 여부를 판단하는 코드를 다음과 같이 작성했습니다. 

 

코드는 JwtProvider 클래스를 생성해 jwt 토큰을 관리하는 로직을 분리해서 구현했습니다.

토큰 생성, 유효 기간은 1일로

먼저 jjwt를 이용해 jwt를 생성하는 과정은 위와 같습니다. 각각의 부분은 Base64 인코딩 방식으로 인코딩 되고, String 타입으로 token을 생성한 뒤 반환합니다.

토큰 유효성 검증 로직

Jwt 또는 OAuth 방식으로 토큰을 사용하는 경우 전달되는 토큰 앞에 Bearer라는 타입이 concatenation 되어 전달됨을 알 수 있었습니다.

 

그래서 BearerRemove라는 method를 생성해, 전달된 token에서 jwt가 담고있는 정보만을 추출합니다.

Authorization: [type] [credentials]

이런 형태로 HTTP message의 header에 jwt가 실려서 전달된다고 합니다. (type = Bearer로 기입된다.)

 

기입된 type에 따라 토큰을 다른 방식으로 처리하게 되고, Bearer로 타입이 기입되면, jwt로 토큰을 취급하게 된다고 합니다.

Controller의 response에 사용하기 위한 DTO들

위와 같은 방식으로 DTO를 설계한 다음

token 생성을 담당하는 부분

/token-create/{user-id}라는 URI로 GET 요청이 들어올때, user id를 갖고 토큰 생성을 담당하는 로직을 위와 같이 구현했습니다.

 

생성된 토큰을 parsing 하면 Claim이라는 객체를 반환하는데, 이 객체는 토큰을 파싱해서 얻은 JWT body를 관리하는 객체입니다.

 

Claim 객체를 이용해 토큰에 실려온 다양한 정보를 확인할 수 있습니다.

토큰의 유효성을 검증하는 부분

Controller에서는 앞서 구현한 JwtProvider를 스프링 컨테이너의 생성자 주입 과정을 통해 주입받아 사용하고, jwtProvider의 createToken method를 이용해 토큰을 생성, parseJwtToken method를 이용한 유효성 확인까지 바로 진행합니다.

 

이때, parseJwtToken method로 token을 바로 넘기지 않고, 앞에 "Bearer"를 concatenation해서 전달하는데, 이는 클라이언트에서 토큰이 전달되 때에는 앞에 붙는 타입이 있음을 고려해서 parseJwtToken method를 설계했기 때문입니다.


Postman을 이용한 테스트

path parameter로 유저 아이디를 전달해서 토큰을 생성

토큰을 이용해 아래의 토큰 확인 로직까지 실행해보면

성공하는 결과를 확인할 수 있었습니다.

그런데, 포스트맨 사용시 Authorization 탭에서 따로 인증 관련된 토큰을 지정할 수 있어서 바꿔서 다시 해보겠습니다.

결과는 성공!

Authorization 탭에서 Bearer token을 선택하고, 생성된 토큰을 헤더에 실어서 보낼 수 있었습니다.

 

여기에 더불어 토큰의 생성 과정에서 유효 기간 만료나 토큰 검증 실패에 따라 다양한 Exception이 runtime에 발생하는데, 이 부분의 예외 처리와 관련된 부분은 천천히 공부해보려고 합니다!


공부에 참고한 글들

https://escapefromcoding.tistory.com/255

 

JJWT

Java JWT: JSON Web Token for Java and Android JAVA JWT : JSON Web Token for Java and Android JJWT는 JWT를 생성하고 증명하는 라이브러리로서 자바와 JVM과 안드로이드에서 가장 쉽게 사용하고 이해할 수 있는 것을 목표

escapefromcoding.tistory.com

https://velog.io/@cada/%ED%86%A0%EA%B7%BC-%EA%B8%B0%EB%B0%98-%EC%9D%B8%EC%A6%9D%EC%97%90%EC%84%9C-bearer%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C

 

토근 기반 인증에서 bearer는 무엇일까?

본 글은 MDN - HTTP 인증, Veloport님의 게시글을 참고하여 작성되었습니다. 자세하게 알고싶으신 분은 해당 링크를 참고해주세요.토큰 기반 인증인증 타입마치며토큰 기반 인증은 쿠키나 세션을 이

velog.io

https://veneas.tistory.com/entry/Spring-Boot-JWT-JSON-Web-Token-%ED%86%A0%ED%81%B0-%EA%B8%B0%EB%B0%98-%EC%9D%B8%EC%A6%9D

 

[Spring Boot] JWT (JSON Web Token) 토큰 기반 인증

목차 1. 환경 Spring Boot 2.5.6 (Gradle) JDK 11(Java 11) IntelliJ Postman 2. JWT 클라이언트와 서버, 서비스와 서비스 사이 통신 시 권한 인가(Authorization)를 위해 사용하는 토큰 Bearer Authentication (JWT 혹은 OAuth에

veneas.tistory.com

chatGPT

728x90

댓글