개요
- 인증방식은 어떤 서비스를 하던 거의 쓰이며 중요하다. 보통 Cookie/Session/JWT 세가지 방식이 있는데 JWT를 보편적으로 실무에서 많이 사용한다. 위 세가지 방식에 대해 차이점과 왜 JWT가 보편적으로 많이 사용하는지 알아보자.
Cookie / Session 차이점
Cookie
- 웹 브라우저에 저장되는 키-값 쌍의 작은 데이터 파일
- 서버에서 클라이언트에게 쿠키를 설정하도록 요청하고, 클라이언트는 쿠키를 저장하고 다음 요청에 함께 보내게 됨
- 클라이언트 측에서 쿠키를 관리하므로 서버에서는 쿠키를 조작할 수 없음
- 브라우저를 종료해도 쿠키는 보존될 수 있으며, 만료 기간을 설정할 수 있음
-> 단점: 클라이언트에서 관리하므로 보안이 약하다. 또한, 네트워크에 부담이 간다.
Session
- 서버 측에서 클라이언트 상태를 저장하는 방법
- 서버에서 클라이언트에게 고유한 세션 ID를 부여하고, 클라이언트는 이를 쿠키에 저장하여 세션을 인식함
- 클라이언트 측에서는 세션 ID만 저장하므로, 서버에서 세션 데이터를 관리하고 조작할 수 있음
- 브라우저를 종료하면 세션도 함께 종료됨
-> 단점: 서버에서 처리하기 때문에 요청이 많아지면 서버에 무리가 간다.
JWT란?
JWT( Json Web Token)는 웹 표준으로, 데이터가 JSON 객체로 안전하게 전송될 수 있도록 디자인된 개방형 표준입니다.
보안적으로 안전하고 신뢰할 수 있는 방식으로 정보를 전송하는 데 사용됩니다. JWT는 보통 인증을 위해 사용됩니다.
JWT는 (.)을 기준으로 세 부분으로 구성됩니다. -> (JWT 예: xxxx.yyyy.zzzz)
1.Header는 JWT가 어떻게 서명되었는지를 설명합니다. 밑 예제는 Base64Url로 인코딩 되었음을 나타냅니다. ( 알고리즘 유형과 토큰의 종류를 나타냅니다.)
{
"alg": "HS256", // 사용한 알고리즘
"typ": "JWT" // 토큰 종류
}
2. Payload는 key/value 값으로 토큰에 담기위한 서명된 데이터를 의미합니다. 데이터들을 claims라고 나타냅니다.
- Registered Claims: 필수는 아니지만 optional인 데이터들이다. 보통 토큰에 대한 기본적인 데이터 들이다.
- iss(issuer): 토큰 발급자
- exp(expiration time): 토큰 만료시각
- sub(subject): 토큰 주제
- aud(audience) : 토큰 대상자
- Public Claims: 공개할 수 있는 공개 클레임. 보통 urI 형식으로 짓는다.
- Private Claims: client / server가 서로 사용하기 위해 약속한 클레임( 보통 userId, username) 과 같은 유저 엔티티에 속한 데이터일 수 있다.
밑 예제 payload는 한개의 registered claim과 2개의 private claims가 있다.
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
3. Signature는 API에서 JWT를 수신하여 유효성을 검사할 수 있도록 서명됩니다. 밑 예제 처럼 secret(서버가 가지고 있는 개인키)와 header와 payload를 header가 가지고있는 알고리즘으로 암호화 한다. secret(서버가 가지고있는 개인키를) 유출하지 않는 이상 복호화가 불가능해서 안전성이 높다. 밑에 예제가 signature이다.
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)
JWT 인증과정
결론
- Session 과 Cookie의 단점을 보완한 JWT는 애플리케이션에서 사용자 인증을 관리하는 데 유용합니다. 특히, 개발자는 토큰을 사용하여 사용자가 로그인한 후에도 서버에 계속 인증을 유지할 수 있습니다. JWT는 매우 유연하고 안전한 방식으로 데이터를 전송하는 데 사용됩니다. 실무에서 보편적으로 가장많이 쓰이는 인증 방식입니다.
reference
'DevOps&Network' 카테고리의 다른 글
[Docker]Docker Compose란? (0) | 2023.04.02 |
---|---|
[AWS] 구축한 Subnet에 EC2 연결 (0) | 2023.03.23 |
[AWS] VPC & SUBNET 구축하기 (0) | 2023.03.20 |