2024. 5. 22. 19:44ㆍTIL
✔오늘 배운 중요한 🔑 point
- 쿠키/세션 인증 방식은 서버와 클라이언트가 서로 암구호를 정한 것 , 따라서 서버가 A 서버에 세션ID를 부여받을 경우 B서버에서는 해당 세션ID가 존재하지 않기때문에 ERROR를 응답한다. 따라서 여러대일 경우에는 인증이 안되는 확장성 문제가 있다.
- 토큰 인증 방식은 서버가 클라이언트에게 출입증을 발급해주는것, 출입증은 데이터의 사이즈가 크기 때문에 인증 요청이 많아지면 네트워크 부하가 발생할 수 있다.
- 토큰 인증 방식중 JWT(JSON Web Token) 방식을 가장 많이 사용하며 Header와 Payload 부분이 JSON으로 이루어져 있다
🎯 오늘 배운 내용
인증?
지금 현재 진행하고 있는 프로젝트에서는 회원가입에 대한 기능만 구현되어 있고 로그인 로그아웃에 대한 기능은 구현되어 있지 않은 상태이다.
사용자의 loginId과 loginPassword를 database에 저장이 되어있지만 이를 활용해서 사용자가 로그인을 시도할때 해당 로그인이 적합한지를 가리는 인증 부분이 필요하다.
그렇다면 인증에 대해서 알아보자
인증은 여러 기반의 방식이 있는데
쿠키(Cookie)/세션(Session) 기반 인증과 토큰(Token) 기반 인증이 있다
쿠키(Cookie)/세션(Session) 기반 인증
인증방식
- 클라이언트가 로그인 요청-> 세션 ID부여 -> 세션 ID를 서버에 저장
- 서버는 세션ID를 쿠키에 설정하여 다음 요청부터 세션 ID 확인 가능
- 클라이언트는 세션ID가 담긴 쿠키를 서버로 보냄
- 서버는 그 세션ID가 존재하는지 저장소에서 확인하고 맞으면 응답함
- 세션ID가 있어도 클라이언트의 권한이 해당Resource에 대해 없으면 에러 응답
세션ID를 통해 CLIENT의 인증 상태 정보를 확인한다
장점: 보안 GOOD, 트래픽 GOOD
클라이언트 정보를 서버에서 관리하기 때문에 보안이 좋고, 세션ID만 왔다갔다 하기때문에 트래픽 또한 적게 사용한다.
단점: 확장성 BAD
서버가 여러대일경우에 문제가 발생함. A라는 서버가 해당 클라이언트의 세션ID를 저장한 상태라면 해당 클라이언트는 B라는 서버에 세션ID를 담은 요청을 보내게 되면 B라는 서버는 에러를 응답한다.
토큰(Token) 기반 인증
인증방식
- 클라이언트가 로그인 요청 -> 서버에서 토큰을 생성해서 응답으로 전달
- 클라이언트가 자체적으로 응답받은 토큰을 저장
- 클라이언트가 서버에 요청할때 토큰을 함께 보냄 (보통 HTTP Header에 넣음)
- 서버는 해당 토큰이 자신이 생성한 토큰인지 검증함
- 자신이 생성한 토큰이 맞다면 응답함
CLIENT의 토큰이 서버에서 발급한게 맞는지를 통해서 인증 상태정보를 확인한다
장점: 확장성 GOOD
서버에서 토큰을 저장하지 않고,세션 상태를 유지하지 않기 때문에 확장성이 좋고, 다른 별도의 시스템이더라도 검증 방식만 공유가 된다면 다른 로그인 시스템에도 동일한 토큰으로 인증을 할 수 있다
단점: 보안 BAD, 네트워크 부하 BAD
토큰 자체에 유저의 중요한 정보를 담기에는 보안상 취약하고, 세션 ID에 비해 데이터의 사이즈가 크기 때문에 네트워크 부하가 발생할 수 있다
서버의 확장성이라는 장점으로 인해 토큰(Token) 기반의 인증을 대부분 사용한다!!
그 중에서도 JWT(JSON Web Token) 형태를 가장 많이 사용한다
JWT(JSON Web Token) 이란?
XXXXX. YYYYY. ZZZZZ 형태의 문자열로 이루어진 토큰(Token)
(Header) (Payload) (Signature)
Header와 Payload부분이 JSON으로 이루어져있어 JSON Web Token이라고 부른다
Header : 토큰의 타입과 해싱 알고리즘 정보를 담고 있다
{
"alg": "HS256",
"typ": "JWT"
}
Payload: 토큰에 담을 클레임(claims)이 들어있다.
(클레임은 토큰에 포함된 정보의 한 조각)
{
"sub": "1234567890",
"iat": 1516239022,
"name": "Ernest Hemingway",
}
Signature: Header와 Payload를 인코딩한 후 비밀키를 사용해 생성된 해시
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)
🤔 어떻게 활용할까?
토큰 기반 인증 방식 중 하나인 JWT는 자체적으로 정보를 담고있고, 서명을 통해 무결성을 검증할 수 있어 효율적이고 안전하게 인증을 처리할 수 있지만, 토큰의 크기가 크기때문에 네트워크 부하 등이 발생할 수 있는 단점 등을 고려해서 인증방식을 잘 선택해야한다.
📓 오늘의 한줄
"Nous étions une famille, réunie dans un moment parfait figé dans le temps éternel."
( "We were a family, gathered in a perfect moment frozen in eternal time." )
- Guillaume Musso -
'TIL' 카테고리의 다른 글
간단한 API를 직접 만들어보자(6) -댓글이 있는 카드 삭제하기- (0) | 2024.05.24 |
---|---|
간단한 API를 직접 만들어보자 (5) -환경변수 활용 및 댓글 기능 추가- (1) | 2024.05.23 |
간단한 API를 직접 만들어보자(4) Status code 500 해결 (0) | 2024.05.21 |
JPA (0) | 2024.05.20 |
(SQL) 식품 종류별 비싼 식품 정보 조회하기 (0) | 2024.05.19 |