기본 콘텐츠로 건너뛰기

이메일 인증 보완

이메일 인증 보완
- 인증을 신청한 기기 이외의 기기에서도 인증 답변 메일 확인
- 이메일에 인증용 암호 문자열을 전달
- 이메일 수신자가 메일을 열고 링크 클릭 > 암호 문자열을 다시 서버로
- 이메일을 보낼 때의 서버측 메소드와 암호 문자열을 다시 받을 때의 메소드는 다르다
- 이용자의 세션에 암호 문자열을 기억시키고 돌아왔을 때의 암호 문자열 비교
- 위의 절차가 모두 동일 시스템에서 실행된다면 아무런 문제가 없다
- 다른 시스템에서 실행된다면 문제가 발생한다(한개의 세션이 아닌 상황이 된다)

이메일 인증시 메일 내용에 암호 문자열, 세션 아이디를 함께 보낸다
String sid = session.getId();
String authrStr = UUID.randomUUID().toString().replaceAll("-","");
<a href="ipaddress/email=/auth?sid="+sid+"&auth="+authStr+"">인증하기</a>

세션이 생성될 때마다 인지하여 컬렉션에 세션을 저장한다
- HttpSessionListener를 등록한다
- 세션이 생성될 때마다 Map<String,HttpSession> 컬렉션에 세션을 저장한다

컨트롤러에서 세션이 저장된 컬렉션을 사용하여 모든 세션에 접근할 수 있다
- @PathVariable("sid") String sid, @PathVariable("auth") String auth
- HttpSession ss = map.get(sid);
- String authStr = ss.getAttribute("auth");
- if (auth.equals(authStr)) { // 인증 성공 }

@WebListener // 웹 감청기, 웹에서 발생하는 어떤 이벤트를 감청하고 있는 클래스
public class HttpSessionHandler implements HttpSessionListener {
    public static Map<String, HttpSession> map = new HashMap<>();
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        HttpSession s = se.getSession();
        String sid = s.getId();
        map.put(sid, s);
    }
    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        HttpSession s = se.getSession();
        map.remove(s.getId());
    }
}

컨트롤러에서 위의 map에 접근하고 사용하기
HttpSession original = HttpSessionHandler.map.get(sid);

HttpSession의 작동 원리
- Cookie

이 블로그의 인기 게시물

Blogger

코드 하이라이트 사이트 http://hilite.me/ 코드 <!-- 나만의 공간 --> <style id='daru_css' type='text/css'> .code {      overflow: auto;      height: 200px;      background-color: rgb(239,239,239);      border-radius: 10px;      padding: 5px 10px; } .code::-webkit-scrollbar-thumb {      background-color: grey;      border: 1px solid transparent;      border-radius: 10px;      background-clip: padding-box;   } .code::-webkit-scrollbar {      width: 15px; } </style> <!-- 나만의 공간 -->

Python Sklearn make_blobs

from sklearn.datasets import make_blobs 예제 X, y = make_blobs(n_samples=500, centers=3, n_features=2, random_state=0) # 500개의 점을 3개로 모이게 한다, 변수는 2개, 무작위 상태는 0 X.shape, y.shape # ((500, 2), (500,)) plt.scatter(X[:,0],X[:,1],c=y,s=5) plt.show() # 학습 데이터 나누기 from sklearn.model_selection import train_test_split x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=.25, random_state=0) x_train.shape, x_test.shape, y_train.shape, y_test.shape # ((375, 2), (125, 2), (375,), (125,)) # 지도 학습 하기 from sklearn.linear_model import LogisticRegression logisticReg = LogisticRegression(max_iter=5000) # 기본 반복 100 logisticReg.fit(x_train, y_train) # 추정하기 pred = logisticReg.predict(X) # 결정계수 logisticReg.score(x_test, y_test) # 0.92 # 한글 깨짐 없이 나오게 설정 from matplotlib import rcParams # 인코딩 폰트 설정 rcParams['font.family'] = 'New Gulim' rcParams['font.size'] = 10 # 산점도 plt.figure(figsize=(10,4)) plt.subplot(1,2, 1) plt.scatter(X[:,0],X[:,1],c=y) plt.title('정답') plt.su...

Python 문법

제곱 c = c**2; 주석 # 주석 함수 # 함수 형식 def hello(): # 함수 선언     print("여기는 함수") # 함수 실행문 hello() # 함수 호출 #결과: 여기는 함수 def add(a,b): # 매개변수에 자료형이 필요없다     c = a+b     print(f"{a} + {b} = {c}") add(3,5) #결과 : 3 + 5 = 8 if문 if a > b:     print("a가 큽니다") 객체의 정보 dir(객체) 객체의 주소 id(객체) 생략 if 'a' == 'a':     pass # 생략 else:     pass # 생략 enumerate for i,v in enumerate(range(20, 26)):     print(i,v) display display(df)