Spring Boot JWT Tutorial (1) – JWT 소개, 프로젝트 생성

튜토리얼 코드

https://github.com/SilverNine/spring-boot-jwt-tutorial

바로가기

Spring Boot JWT Tutorial (1) – JWT 소개, 프로젝트 생성

Spring Boot JWT Tutorial (2) – Security 기본 설정, Data 설정

Spring Boot JWT Tutorial (3) – JWT 코드, Security 설정 추가

Spring Boot JWT Tutorial (4) – Repository, 로그인

Spring Boot JWT Tutorial (5) – 회원가입, 권한검증

들어가기 전에

본 튜토리얼은 Spring Boot를 이용해 JWT 방식의 인증을 구현한 심플한 튜토리얼입니다.

후에 이를 이용해 Vue.js 혹은 React를 이용한 Frontend JWT Tutorial을 이어서 진행할 생각입니다.

마음 편히 천천히 따라해보시고 궁금한 점이 있으시면 언제든 문의주세요 🙂

아참, 본 튜토리얼을 진행하시려면 2가지 프로그램이 미리 설치되어 있어야 합니다. ( 당연한 이야기이지만 )

– IntelliJ, VSCode 등의 IDE

– Postman

자 이제 시작하겠습니다.

JWT ( JSON Web Token ) 소개

JWT 정의

JWT는 웹표준(RFC7519)으로 지정되어 있고 Json 객체를 사용해서 Token 자체에 정보들을 저장하고 있는 Web Token이라고 정의할 수 있습니다.

JWT 구조

JWT는 Header.Payload.Signature 세 부분으로 구성되어 있습니다.

Header : Signature를 해싱하기 위한 알고리즘 정보들이 담겨 있습니다.

Payload : 서버와 클라이언트가 시스템에서 실제로 사용되는 정보에 대한 내용을 담고 있습니다.

Signature :  Token의 유효성 검증을 위한 암호화된 문자열입니다. 이 문자열을 통해 서버에서는 유효한 Token인지를 검증할 수 있는 것이죠.

JWT 장점

중앙의 인증 서버와 데이터 스토어에 대한 의존성이 없기 때문에 수평 확장이 용이하다는 큰 장점이 있습니다.

Base64 URL-Safe 인코딩을 이용하기 때문에 URL, Cookie, Header 어디에서든 사용할 수 있는 범용성을 가지고 있습니다.

특히 개발자가 사이드 프로젝트를 진행할때 간편하게 인증 단계를 구현하기 위한 최고의 방법이 아닐까 합니다.

JWT 단점

토큰 내부에 정보가 저장되기 때문에 노출되면 안되는 정보를 저장하는 실수를 범할 수 있습니다.

또한, Payload에 저장하는 정보가 많아지면 트래픽 크기가 커질 수 있습니다.

토큰이 서버에 저장되지 않고, 각 클라이언트에 저장되기 때문에 서버에서 각 클라이언트에 저장된 토큰 정보를 직접 조작할 수 없습니다.

프로젝트 생성

Spring Initializr ( https://start.spring.io ) 에 접속하여 프로젝트를 생성합니다.

종속성은 Spring Web, Spring Security, Spring Data JPA, H2 Database, Lombok, Validation를 선택하고 Generate를 클릭합니다.

생성된 프로젝트를 오픈하면 아래와 같은 구조로 되어 있습니다.

만약 IntelliJ를 사용하신다면 Lombok의 사용을 위해 아래 설정화면에서 Enable annotation processing를 체크해주세요.

Preferences > Build, Execution, Deployment > Compiler > Annotation Processors

자 이제, controller 패키지를 생성하신 후 하위에 HelloController.java를 만들어 보겠습니다.

Application을 실행시켜 보겠습니다. JwtTutorialApplication을 클릭하고 마우스 오른쪽 버튼 누르시고 Debug Go!

HelloController가 잘 동작하는지 확인하기 위해 Postman을 이용해서 테스트 해보겠습니다.

GET을 선택하고 http://localhost:8080/api/hello를 호출해봅니다.

예상한 결과와는 틀리게 401Unauthorized 응답이 리턴되네요.

다음 편에서는 이를 해결하기 위한 Security 기본 설정과 Data 관련 설정을 진행해보도록 하겠습니다.