일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- Git
- 예외처리
- 반복문
- 웹개발
- 자바스크립트
- order by
- scanner
- BufferedReader
- MySQL
- 프로그래머스 SQL
- Linux
- DML
- SQL
- 알고리즘
- 형변환
- 클래스
- html
- 백준
- Java
- where
- 자바
- StringBuilder
- sql문
- github
- 데이터 조회
- for문
- 개발자
- 리눅스
- 정보처리기사
- String클래스
- 프로그래밍
- select문
- 입출력
- 백엔드
- 프로그래머스 sql 고득점 kit
- 정보처리기사필기요약
- 프론트엔드
- select
- 메서드
- JavaScript
- Today
- Total
ToBe끝판왕
[ 개념 정리 ] Session 과 Token 로그인 방식 본문
■ 로그인 방식
▶ 로그인 방식에 대한 생각
로그인은 인증 ( 클라이언트가 본인임을 검증하는 과정 ) + 인가 ( 인증 작업 후, 클라이언트에게 접근권한 부여 )
으로 이루어져 있으며 보통 로그인을 구현하는데 세션 ( Session ) 과 토큰 ( Token )을 이용한 방식으로
구현하게 된다.
세션 ( Session ) 로그인 방식
• 세션 ID 로그인 방식
- 서버에서 Session ID 생성
( 계정 정보를 읽어 사용자 확인 후, 고유한 ID 값을 부여하여 세션 저장소에 저장하고 Session ID 발급 )
- 서버는 HTTP 응답 헤더에 발급된 Session ID 를 실어 보낸다. 매 요청마다 HTTP 요청 헤더에
Session ID 가 담긴 쿠키를 같이 실어 보낸다.
- 서버에서는 쿠키를 받아 Session 저장소에서 대조를 한 후, 대응되는 정보를 가져와 인증이 완료되면
사용자에게 맞는 데이터를 보내준다.
- Session 은 서버측에서 관리
( 서버에서 Session 정보를 저장하고 필요에 따라 삭제도 가능 하다. )
• 세션 ID 로그인 장점
- 사용자의 정보는 Session 저장소에 저장되고 Cookie 는 그 저장소를 통과할 수 있는 출입증 정도의 역할이다.
- Cookie 가 담긴 HTTP 요청이 도중에 노출되더라도 Cookie 자체에는 유의미한 값을 갖고 있지 않아 안전하다.
( 즉 보안성이 높다. )
• 세션 ID 로그인 단점
- 세션 하이재킹 공격에 취약
( 해커가 Cokkie를 탈취 후, HTTP 요청을 보내면 서버는 사용자로 오해하여 정보를 전달하게 됨 )
- 클라이언트가 요청할 때마다 서버에서 Session
• 세션 로그인 방식 주의점
- 세션 유효시간 설정 : 적절한 세션 유효시간을 설정하여 보안을 강화해야 함
- 세션 고정 공격 방지
• 세션 방식 주요 메서드
메서드명 | 설명 |
HttpSession | 세션 정보를 관리하는 객체 |
getSession() | 기존 세션이 있으면 반환, 없으면 새로운 세션을 생성하여 반환 |
setAttribute(String name, Object Value ) | 세션에 속성을 설정 |
getAttribute( String name ) | 세션에 설정된 속성을 가져옴 |
removeAttribute(String name ) | 세션에서 속성을 제거 |
invalidate() | 세션을 무효화 |
• 세션 메서드 사용 예시
@GetMapping("/myPage")
public String myInfoPage( @ModelAttribute("userInfo") UserDto userDto, Model model) throws Exception {
log.info("========== 마이페이지 양식 페이지 ==========");
// 세션에서 회원ID 세팅
// 요청에 연결된 세션 반환 ( false = 새로운 세션 반환, 없으면 null 반환 )
HttpSession session = request.getSession(false);
// 세션에 저장된 "loginMember" 속성을 가져온다.
LoginDto loginDto = (LoginDto) session.getAttribute("loginMember");
if (session != null) {
String memberId = loginDto.getMemberId();
( .... 추가 로직 )
}
토큰 ( Token ) 로그인 방식
• JWT ( Json Web Token )
- 가장 많이 사용되는 토큰 형식으로, JSON 형식으로 되어 있으며 디지털 서명이 포함되어 있다.
- 로그인 이후, 서버가 만들어서 사용자에게 넘겨주는 문자열이 토큰이다.
- 해당 문자열은 사용자 정보가 암호화 되어 있고, 토큰을 이용하여 인증된 사용자인지 서버가 판단한다.
• JWT ( Json Web Token ) 의 구조
1) Header
- 토큰의 종류 , 해싱 알고리즘의 정보 로 2가지 정보가 담겨져 있다.
- typ : 토큰의 타입을 지정
- alg : 해싱 알고리즘을 지정
( 보통 HMAC-SHA256 혹은 RSA 가 사용, 알고리즘은 토큰을 검증할때 사용되는 signature 부분에서 사용 )
2) Payload
- 토큰의 내용물이 인코딩 된 부분
- 사용자 정보 ( 아이디, 권한 등 ) 을 JSON 형식으로 담는다.
3) Signature
- 토큰을 인코딩하거나 유효성 검증 할 때 사용하는 고유한 암호화 코드
- Header 와 Payload 의 값을 각각 BASE64 로 인코딩하고, 인코딩한 값을 비밀키로 이용해 헤더에서 정의한 알고리즘을 해싱하고
이 값을 다시 BASE64 로 인코딩하여 생성
- 토큰의 무결성을 보장
• 토큰 ( Token ) 로그인 방식
- 사용자는 Id 와 password 를 입력하고 서버로 요청
- 서버는 DB 에서 회원정보를 조회하고 등록된 사용자인지 확인
- 등록된 사용자라면 서버는 토큰을 생성하고 앞단으로 토큰과 함께 응답을 전송
- 응답이 성공적으로 왔다면, 로그인( 인증 ) 이 성공적으로 된 것이므로 요청에 Token을 함께 보낸다.
- 서버는 로그인 이후의 추가 요청에 함께 실려온 토큰을 검증하고 검증이 성공적으로 끝나면 권한이 있는 사용자라 판단하고
요청된 데이터에 응답해준다. ( 인가 )
▶ 토큰 로그인 방식 과정
로그인 요청 -> 인증 -> 토큰 발급 -> 토큰 저장 -> 후속 요청 -> 토큰 검정 -> 응답
• 토큰 로그인 장점
- 자체적으로 유효성 검증 가능 ( 토큰내 정보를 통해서 서버에서 별도의 저장 없이 유효성 검증 가능 )
- 다양한 정보를 Payload 에 추가하여 사용 가능하다. ( = 확장성이 좋다. )
- Json Web Token 표준을 따라 많은 라이브러리와 도구를 활용 가능하다.
• 토큰 로그인 단점
- JWT 토큰 을 생성하고 검증하는데 사용되는 비밀키를 안전하게
- 토큰의 유효시간을 관리 해야 한다.
- 토큰 탈취 시, 권한이 도용 가능하다.
• 토큰 로그인 방식 주의점
- 토큰이 만료되기 전에 미리 갱신하는 기능의 구현 필요성
- 적절한 유효기간을 설정해서 보안을 강화해야 한다.