JWT(JSON Web Token)?
인증에 필요한 방식으로 특정유저가 로그인 할 때, 정말로 인증된 사용자인지 검증할 때 사용.
로그인한 정보가 정말로 인증된 사용자인지 검증할때 사용
- 사용예시
- 인증된(로그인한) 유저만 게시글을 작성 -> 특정회원으로 로그인 됨을 증명
- 인증된 관리자만 데이터베이스에 접근 -> 관리자로 로그인 됨을 증명
장점 / 단점
- 장점
- 가볍고 클라이언트 어플리케이션에서 사용하기 쉽다 (예) 모바일 어플리케이션
- 토큰에 모든정보가 들어가 있어서 토큰을 이용해서 인증(검증)이 가능하다.
- 4가지 단계의 인증절차
- 요청(클라이언트,사용자) -> 확인(서버) -> 토큰(서버가 사용자를 확인하고 토큰발급) -> 저장(사용자의 브라우저에 저장)
- 4가지 단계의 인증절차
- 토큰 만료 시스템이 있다.
- 단점
- 단일 키를 이용하여, 노출되면 시스템 전체가 위험에 노출된다.
- 토큰이 복잡하여 이해하기가 쉽지 않다.
- 개발자가 암호서명 알고리즘에 정통하지 않으면 자신도 모르게 시스템을 위험에 빠뜨릴 수 있다.
- 메세지를 모든 클라이언트에게 푸쉬 불가능, 서버 측 클라이언트도 관리할 수 없다
구성
- 구성 -> 토큰을 받으면 https://jwt.io/ 에서 아래 처럼 디코드 된 것을 확인 가능
- eyJhbGciO.I6IkpvaG4gRG2MjM5MDIyfQ.POk6yJV_adQssw5c
- Header.Payload.Signature
/* Header (알고리즘, 토큰 타입)*/
{
"alg": "HS256", // 서명(signature) 생성 시 사용한 해시 알고리즘 : HS256 지원
"typ": "JWT" // 토큰 타입 : < JWT 만 지원>
}
/* Payload (내용, 데이터) */
{
"id": 1,
"iat": 1699358134, // 토큰 발행 시간
"exp": 1700222134 // 토큰 만료 시간 (옵션)
}
/* VERIFY SIGNATURE */
/* header와 payload에 입력된 값을 암호화 하고
secret 부분은 검증(보안서명을 통해 메세지가 전송 과정에서 바뀌지 않은 것을 확인)*/
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
your-256-bit-secret
)
인증/ 작동 과정
- 요청(클라이언트,사용자) -> 확인(서버) -> 토큰(서버가 사용자를 확인하고 토큰발급) -> 저장(사용자의 브라우저에 저장)
사용이유
- 임시 엑세스를 자주 허용하는 관리자에게 유용
- 날짜, 시간 또는 특별 이벤트에 따라 사용자 수의 변동 폭이 크면 액세스를 반복해서 허용 또는 취소해야 할 경우 유용
- SAML (security assertion markup language token) 보다 간결하고 데이터 크기도 훨씬작다.
- 확장성이 좋다.
- 데이터 위조 변조를 방지
사용시 주의사항
- alg:none ( header ) : 가끔 어떤 사이트들은 alg 가 none 일 경우 인가해주는 경우 존재
- Decoding : JWT 디코딩은 쉬운 편이다. 그래서 민감한 정보를 많이 넣느 것을 주의하고 최소한의 정보만 넣어야 한다.
- 시크릿키 문제: 개발자가 시크릿 키를 대충 구현하면 공격받기 쉽다.
- 공유금지, 길게 설정하기
- 탈취에 유의
- 블랙리스트 생성, 유효기간 짧게 설정, 훔치기 힘든 저장소( http only cookie)에 JWT 저장
참고자료
https://velog.io/@j_user0719/JWT-%EC%82%AC%EC%9A%A9%EC%8B%9C-%EC%A3%BC%EC%9D%98%EC%82%AC%ED%95%AD
'프로그래밍 > Node.js' 카테고리의 다른 글
[예제] 인증 및 인가(JWT), 암호화 (1) | 2023.11.19 |
---|---|
비밀번호 암호화하기 기본(단방향) (0) | 2023.11.18 |
[Sequelize] DB연결 에러 (0) | 2023.08.07 |
[Sequelize] ORM for SQL : 설치 및 DB연결 (0) | 2023.08.07 |
REST API 설계하여 요청 및 응답하기 : body-parser 이용 (0) | 2023.07.29 |