반응형
Java 로는 많이 만들어봤느데, javascript 로는 해보지 않아 정리해봅니다.
라이브러리는 node에서 쉽게 받을 수 있습니다.
const jwt = require('jsonwebtoken');
const signKey = 'signkey로사용할조금긴문자열을입력합니다.';
const expirationTimeInSec = 86400; // 24시간 (초 단위)
function generateBasicToken(subject) {
const createdDate = Math.floor(Date.now() / 1000); // 초 단위로 현재 시간
const claims = {
iat: createdDate, // 발행 시간 (초 단위)
exp: createdDate + expirationTimeInSec // 만료 시간 (초 단위)
};
return generate(claims, subject);
}
function generate(claims, subject) {
return jwt.sign(claims, signKey, {
subject: subject,
algorithm: 'HS512'
});
}
// 테스트
const token = generateBasicToken('test_subject');
console.log(token);
보내는 곳에서 token 을 직접 만들어 전달한다면 signkey 와 알고리즘을 동일하게 유지해야 합니다.
암호화에서 보면 공개키, 개인키 가 있는데, 일종의 개인키라고 봐도 됩니다.. 외부에 노출되면 절대 안되는 코드..
javascript의 경우 비교적 간단하게 만들어집니다.
Java의 경우 아래와 같이 작성합니다.
import java.time.Instant;
import java.security.Key;
import javax.annotation.PostConstruct;
import org.springframework.stereotype.Component;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import javax.crypto.spec.SecretKeySpec;
@Component
public class TokenUtil {
private Key key;
private String signKey = "signkey는동일하게입력해주면됩니다.길게입력해야합니다.";
private static long expirationTimeInSec = 86400L; // 24시간 유효
@PostConstruct
public void init(){
this.key = new SecretKeySpec( DatatypeConverter.parseBase64Binary( signKey), SignatureAlgorithm.HS512.getJcaName());
}
public String generateBasicToken(String subject) {
final Instant createdDate = Instant.now();
Map<String, Object> claims = new HashMap<>();
claims.put("iat", createdDate.toEpochMilli());
claims.put("exp", createdDate.plusSeconds( expirationTimeInSec).toEpochMilli());
return generate(claims, subject);
}
private String generate(Map<String, Object> claims, String subject) {
return Jwts.builder()
.setClaims(claims)
.setSubject(subject)
.signWith( key)
.compact();
}
}
위 두 코드는 동일한 token 을 생성해냅니다.
claims 는 token 에 담을 데이터 입니다.
iat 는 토큰 생성시간
exp 는 만료시간입니다.
따로 데이터를 select하는 과정을 거치지 않더라도 이 암호화된 token 에서 데이터를 저장하고 꺼내 쓸 수 있습니다.
일종의 세션 데이터를 들고다닌다고 보면 될거 같습니다.
너무 큰 데이터를 가지고 다니기에는 오버헤드가 발생할 수 있으니, 꼭 필요한 데이터만 넣도록 합니다.
반응형
'프로그래밍' 카테고리의 다른 글
Clickhouse Server Docker 설치 (0) | 2024.09.11 |
---|---|
Clickhouse - 다른 Clickhouse 서버의 table을 현재 서버로 복사하기 (0) | 2024.09.10 |
Spring AOP 의 JoinPoint 에서 class name, method name 얻는 방법 (0) | 2024.06.19 |
Javascript Network visual 라이브러리 정리 (0) | 2024.06.10 |
도커(docker) 로 Clickhouse db 설치하기 (0) | 2024.03.14 |