서명된 access token의 발급·검증 책임과 한계를 이해합니다.
JwtService는 payload를 서명하고 signature, issuer, audience, 만료를 검증합니다. JWT는 암호화가 아니므로 비밀정보를 payload에 넣지 않습니다.
짧은 access token 수명, refresh token 회전·폐기, key 관리와 탈취 대응을 함께 설계합니다.
브라우저 저장 위치는 XSS와 CSRF 위협 모델을 기준으로 결정합니다.
decode 결과만 읽고 signature를 verify하지 않으면 위조 token을 신뢰하게 됩니다.
로컬 프로젝트에서 확인해보세요expiresIn을 짧게 설정하고 issuer와 audience 검증을 추가하세요.
import "reflect-metadata";
import { Controller, Get, Module } from "@nestjs/common";
import { JwtModule, JwtService } from "@nestjs/jwt";
import { NestFactory } from "@nestjs/core";
@Controller()
class AppController {
constructor(private readonly jwt: JwtService) {}
@Get() async home() {
const token = await this.jwt.signAsync({ sub: "user-7", role: "member" });
const payload = await this.jwt.verifyAsync(token);
return { tokenPreview: token.slice(0, 24) + "...", payload };
}
}
@Module({
imports: [
JwtModule.register({
secret: "demo-only-secret-change-in-production",
signOptions: { expiresIn: "5m" },
}),
],
controllers: [AppController],
})
class AppModule {}
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(4173, "0.0.0.0");
}
bootstrap();