1. 암호화
1) 단방향 (Encoding 만 가능) → 서명, 위조 검증
2) 양방향 (Encoding Decoding 가능)
- 대칭키 (열쇠가 하나) - 생성과 검증을 한놈이 할때
- 공개키 (열쇠가 쌍으로 두개) - 생성과 검증을 다른놈이 할때
3) Base64
- 아스키코드 8bit → 2의 8승 → 경우의 수가 256
- Base64 6bit → 2의 6승 → 경우의 수가 64 - 양방향 - 누구나 복호화 할 수 있다.
- 파일이나 사진이나 이런것들을 문자화해서 전송하기 위해서!!
- JSON에 사진을 심어서 함께 전송할 수 있다.
2. JWT(Json Web Token)
JWT(Json Web Token)는 두 시스템 간에 안전하게 정보를 전송하기 위한 개방형 표준(RFC 7519)입니다. 일반적으로 인증 및 권한 부여 목적으로 사용됩니다. JWT는 세 부분으로 구성된 문자열로, 점(
.)으로 구분되어 있습니다:- 헤더(Header): JWT의 타입과 사용된 서명 알고리즘을 정의합니다. 보통 다음과 같이 구성됩니다:
{
"alg": "HS256",
"typ": "JWT"
}- 페이로드(Payload): 클레임(Claims)이라고 불리는 실제 전송되는 데이터를 포함합니다. 페이로드에는 표준 클레임과 사용자 정의 클레임을 포함할 수 있습니다. 예를 들어:
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}이 클레임은
sub(주체), name(사용자 이름), iat(발행 시간) 등을 포함할 수 있습니다.- 서명(Signature): 서명은 헤더와 페이로드를 결합하고, 비밀키를 이용하여 서명 알고리즘(예: HMAC, RSA, ECDSA)을 통해 생성됩니다. 이를 통해 토큰의 무결성을 보장합니다. 서명은 다음과 같이 생성됩니다:
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)쉽게 말해, JWT는 다음과 같이 Header, payload, verify signature 세부분으로 나뉘게 된다.
Header는 해쉬방식, Payload는 정보 그리고 Signature에는 시크릿키가 들어가게 된다.

이를 https://jwt.io/ 에 들어가서 확인할 수 있다.
왼쪽의 Encoded가 암호화된 JWT이고, 오른쪽이 토큰에 담겨져 있는 정보들이다.

3. JWT 생성하기
public class JWTutil {
public static String create(User user){
String accessToken = JWT.create()
.withSubject("바보")
.withExpiresAt(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 24 * 7)) // 만료기간
.withClaim("id", user.getId()) // payLoad
.withClaim("username", user.getUsername())
.sign(Algorithm.HMAC512("metacoding")); // Header의 알고리즘 + 시그니쳐
return accessToken;
}
}4. JWT 검증
public static User verify(String jwt){
DecodedJWT decodedJWT = JWT.require(Algorithm.HMAC512("metacoding")).build().verify(jwt);
int id = decodedJWT.getClaim("id").asInt();
String username = decodedJWT.getClaim("username").asString();
return User.builder()
.id(id)
.username(username)
.build();
}5. JWT 장점
- 서버 상태 유지 필요 없음: JWT는 클라이언트 측에 저장되므로, 별도의 세션 관리를 하지 않고도 사용자 정보를 유지할 수 있습니다.
- 스케일링에 유리: JWT는 서버의 상태를 유지하지 않기 때문에, 여러 서버에서 인증을 처리하는 분산 시스템에서 유리합니다.
- 데이터 자가 포함: JWT 페이로드에 본 글 목록과 같은 데이터를 쉽게 포함할 수 있어, 추가적인 데이터베이스 호출이 불필요할 수 있습니다.
JWT를 사용하는 경우 고려할 점
- JWT 크기 제한: JWT의 크기가 커질 수 있기 때문에, 너무 많은 데이터를 페이로드에 담으면 비효율적일 수 있습니다. 본 글 목록이 너무 많아지면 데이터베이스로 관리하는 것이 나을 수 있습니다.
- 보안: JWT는 인코딩된 형태로 클라이언트에 저장되지만, 암호화된 것은 아닙니다. 따라서 민감한 정보는 JWT에 직접 저장하지 말고, JWT 서명을 통해 무결성을 보장하는 방식으로 관리해야 합니다.
Share article