본 시리즈는 작성자의 이해와 경험을 바탕으로 실습 위주의 설명을 제공하고자 작성되었습니다.
실습 중심의 이해를 목표로 작성되었기 때문에, 다소 생략/과장된 설명이 있을 수 있습니다.
따라서, 이론적으로 미흡한 부분이 있을 수 있는 점에 유의하시고 양해 부탁드립니다.
또한, Spring Boot 기반의 Backend 개발에 중점을 두고 설명하고 있으므로,
Frontend와 관련된 내용은 별도의 참고자료를 검색/활용하실 것을 권장드립니다.
JWT (JSON Web Token)
JWT(JSON Web Token)는 개방형 웹 표준 RFC 7519로 지정된
JSON 객체 형태의 Web Token으로 Token 자체에 정보를 저장하는 인증 방식입니다.OAuth, SAML(Security Assertion Markup Language), OpenID Connect 등과 함께
대표적으로 사용되는 인증 방식으로 다른 인증 방식에 비해 가볍고 간편하다는 장점이 있습니다.
인증 정보를 담은
Token
을 암호화하여 전송
JWT 구조
Header
,Payload
,Signature
로 구성
Header
: 토큰 타입(typ)과 해싱 알고리즘(alg) 정보를 포함Payload
: 사용자 인증 정보와 클레임 데이터를 JSON 형식으로 포함Signature
: Header와 Payload를 특정 비밀키로 서명하여 변조 방지
→ 인증 정보를 담은
Token
을 암호화하여 전송
장점
- 빠른 인증 처리
토큰 자체에 정보를 포함하므로, 데이터베이스 조회 없이 인증 가능- 토큰 기반 인증 방식
중앙 인증서버 방식, 수평적 시스템 확장성 향상
서버 상태를 유지하지 않아도 되므로 확장성 향상- 다양한 플랫폼 지원
표준 규격(JSON)을 사용하여 웹, 모바일, 클라이언트-서버 간 호환성 우수
Base64 URL Safe Encoding을 사용하기 때문에 URL, Cookie, Header 모두 사용 가능
단점
- 토큰 크기
Payload
의 정보가 많아지면, 네트워크 사용량 부담 증가- 보안 관리 필요
비밀키가 유출되면 모든 토큰이 위조될 수 있는 위험성 존재- 토큰 취소 어려움
토큰은 클라이언트에 저장되므로, 서버에서 토큰을 조작할 수 없음
토큰은 클라이언트에 저장되므로, 발급 후 유효기간 만료 전에 취소하기 어려움
JWT 기본설정
JWT(JSON Web Token)를 이용한 인증 구현을 위해
build.gradle
,application.properties
를 설정한다.
dependencies {
// ...
implementation 'org.springframework.boot:spring-boot-starter-security' // 추가
implementation 'io.jsonwebtoken:jjwt-api:0.11.5' // 추가
implementation 'io.jsonwebtoken:jjwt-impl:0.11.5' // 추가
implementation 'io.jsonwebtoken:jjwt-jackson:0.11.5' // 추가
testImplementation 'org.springframework.security:spring-security-test' // 추가
// ...
}
JJWT (Java JWT)
jjwt
라이브러리는 버전0.10.0
부터 3개로 분리됨- 작성일 기준 Maven Repository에서 가장 많이 사용된 최신 버전
0.11.5
과거implementation 'io.jsonwebtoken:jjwt:0.9.1'
- 현재
implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
- 현재
implementation 'io.jsonwebtoken:jjwt-impl:0.11.5'
- 현재
implementation 'io.jsonwebtoken:jjwt-jackson:0.11.5'
# JWT Settings
jwt.secret=your_secret_key
jwt.access.expiration=3600000 # Access Token Expiration: 1hour (ms)
jwt.refresh.expiration=86400000 # Refresh Token Expiration: 24hour (ms)
application.properties
jwt.secret
: 토큰 서명에 사용되는 비밀키 정의
토큰의 유효성을 확인하는 데 필요jwt.access.expiration
: 액세스 토큰의 만료 시간(ms 단위)
일반적으로 짧은 주기로 설정하여 보안 강화jwt.refresh.expiration
: 리프레시 토큰의 만료 시간(ms 단위)
액세스 토큰 갱신을 위해 더 긴 주기로 설정
본 시리즈는 작성자의 이해와 경험을 바탕으로 실습 위주의 설명을 제공하고자 작성되었습니다.
실습 중심의 이해를 목표로 작성되었기 때문에, 다소 생략/과장된 설명이 있을 수 있습니다.
따라서, 이론적으로 미흡한 부분이 있을 수 있는 점에 유의하시고 양해 부탁드립니다.
또한, Spring Boot 기반의 Backend 개발에 중점을 두고 설명하고 있으므로,
Frontend와 관련된 내용은 별도의 참고자료를 검색/활용하실 것을 권장드립니다.