개인 공부😊/JSP

욕설 필터링 기능 (자바스크립트, JSP 크롤링 두가지 방법)

송테이토 2022. 11. 22. 15:52

프로젝트 진행 중 욕설 필터링 기능을 담당하게 되었다.

*상업적 목적이 아닌 개인 공부 목적으로 웹크롤링을 사용하였습니다.

방법1. JSP 크롤링 방식

욕설필터링

핵심코드

Document doc = Jsoup.connect(
                "<https://songsunkite.tistory.com/entry/%ED%81%AC%EB%A1%A4%EB%A7%81-%ED%85%8C%EC%8A%A4%ED%8A%B8%EC%9A%A9-%EA%B2%8C%EC%8B%9C%EB%AC%BC>")
                .get();
        Elements elements = doc.select("div.contents_style p");
        String badword = "";
        for (Element e : elements) {
            badword = e.text();
        }

 if (badword.contains(nickname)) {
        req.setAttribute("Msg",nickname+ "은(는) 욕설이 포함되어있습니다. 
다시 작성해주세요.");
            req.getRequestDispatcher("NicknameCheckForm.jsp").forward(req, resp);

전체 컨트롤러 코드

package board.member;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;
import java.util.Collection;
import java.util.regex.Pattern;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

@WebServlet("/Page/NicknameCheckForm.do")
public class NicknameCheckController extends HttpServlet {
    private static final long serialVersionUID = 1L;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
        resp.setContentType("text/html; charset=UTF-8");

        String nickname = req.getParameter("nickname");

        MemberDAO dao = new MemberDAO();
        boolean result = dao.NickNameCheck(nickname);
        dao.close();

        String spe = "^([ㄱ-ㅎ|가-힣|a-z|A-Z|0-9|]*)$";
        boolean check = Pattern.matches(spe, nickname);

        Document doc = Jsoup.connect(
                "https://songsunkite.tistory.com/entry/%ED%81%AC%EB%A1%A4%EB%A7%81-%ED%85%8C%EC%8A%A4%ED%8A%B8%EC%9A%A9-%EA%B2%8C%EC%8B%9C%EB%AC%BC")
                .get();

        Elements elements = doc.select("div.contents_style p");

        String badword = "";
        for (Element e : elements) {
            System.out.println(e.text());
            badword = e.text();
        }

        if (nickname == "") {
            req.setAttribute("Msg", "별명을 입력해주세요.");
            req.getRequestDispatcher("NicknameCheckForm.jsp").forward(req, resp);
            nickname = "";
        } else if (nickname.length() > 6) {
            req.setAttribute("Msg", "별명은 6글자 이하로 지어주세요.");
            req.getRequestDispatcher("NicknameCheckForm.jsp").forward(req, resp);
            nickname = "";
        } else if (check == false) {
            req.setAttribute("Msg", "공백 없이 한글, 영어, 숫자만 사용가능합니다.");
            req.getRequestDispatcher("NicknameCheckForm.jsp").forward(req, resp);
            nickname = "";
        } else if (nickname == "null") {
            req.setAttribute("Msg", "은(는) 중복된 닉네임 입니다.");
            req.getRequestDispatcher("NicknameCheckForm.jsp").forward(req, resp);
        } else if (badword.contains(nickname)) {
            req.setAttribute("Msg", "\"" + nickname + "\" 은(는) 욕설이 포함되어있습니다. <br>다시 작성해주세요.");
            req.getRequestDispatcher("NicknameCheckForm.jsp").forward(req, resp);
        } else {
            if (result == true) {
                req.setAttribute("Msg",  "\"" + nickname + "\" 은(는) 중복된 닉네임 입니다.");
                req.getRequestDispatcher("NicknameCheckForm.jsp").forward(req, resp);
                System.out.println("중복된 닉네임 ");
                nickname = "";
            } else {
                req.setAttribute("Msg",  "\"" + nickname + "\" 은(는) 사용가능합니다.");

                req.setAttribute("UseMsg", nickname);
                req.getRequestDispatcher("NicknameCheckForm.jsp").forward(req, resp);
                System.out.println("사용 가능 닉네임");
            }
        }
    }
}

방법 2. 욕설 필터링 기능 (자바스크립트 사용)

욕설

욕설 DB를 다운받아 구현한 것이므로 코드안에 노골적이고 직설적인 욕설들이 담겨있어요ㅜㅜ

저도 볼때마다 심장떨림...

badWordFilter.js

// 심한 욕설이 담겨있는 파일이에요......

//욕설 배열
var swear_words_arr = new Array("시발", "새끼", "쌔끼", "후장뚫어18세키", "dogbaby", "18ㅅㅐㄲㅣ", "18ㅅㅔㅋㅣ", "yadong", "ㅌㅓㄹㅐㄱㅣ", "따아알따아리", "막대쑤셔줘?", "보지머리박기", "보지에자지껴", "보지에자지너", "보지핧아줄까", "여자ㄸㅏ먹기", "여자ㄸㅏ묵기", "조개마셔줘?", "조개벌려조?", "조개쑤셔줘?", "조개핧아줘?", "터래기터래기", "혀로보지핧기", "18nom", "18num", "18ㅅㅐ끼", "18ㅅㅔ키", "18세ㅋㅣ", "sex하자", "가슴조물락", "가슴주물럭", "가슴쪼물딱", "가슴쪼물락", "개씨발자슥", "개애거얼래", "개에거얼래", "개젓가튼넘", "개후라들놈", "개후라새끼", "걸레같은년", "괴에가튼?", "따먹어야지", "따아알따리", "떠어라아이", "또오라아이", "막대핧아줘", "미친씨부랄", "바주카자지", "버따리자지", "버어어지이", "버지따먹기", "버지물마셔", "버짓물마셔", "벌창같은년", "보지따먹기", "보지물마셔", "보지벌리자", "보지쥐어짜", "보지털뽑아", "보지틀래기", "보지핧아줘", "보짓물마셔", "빠아구우리", "사까아시이", "쉬이이이이", "쓰브랄쉽세", "야dong", "어미따먹자", "어미쑤시자", "여자따먹기", "여자따묵기", "유발조물락", "유방주물럭", "유방쪼물딱", "유방쪼물럭", "유우우방것", "자지빨아줘", "자지쓰레기", "자지핧아줘", "잠지물마셔", "잠짓물마셔", "젓가튼쉐이", "조개넓은년", "조개따조?", "조오우까튼", "좃만한쉐이", "좆같은새끼", "좆만한새끼", "쳐쑤셔박어", "촌씨브라리", "촌씨브랑이", "촌씨브랭이", "크리토리스", "클리토리스", "sibal", "fuck", "shit", "18새끼", "18세키", "boji", "bozi", "jaji", "jazi", "jot같", "sex해", "zaji", "zazi", "ㅅㅐㄲㅣ", "ㅆㅣㅂㅏ", "ㅆㅣ팍넘", "ㅇㅍㅊㅌ", "가슴만져", "가슴빨아", "가슴빨어", "가슴핧아", "가슴핧어", "강간한다", "같은새끼", "개가튼년", "개가튼뇬", "개같은년", "개거얼래", "개거얼레", "개념빠가", "개보지년", "개쓰래기", "개쓰레기", "개씁자지", "개씨발넘", "개애걸래", "개에가튼", "개에걸래", "개작두넘", "개작두년", "개잡지랄", "개저가튼", "개지랄넘", "개지랄놈", "개후라년", "걔잡지랄", "거지같은", "걸레보지", "걸레핀년", "게에가튼", "게지랄놈", "그나물에", "나쁜새끼", "난자마셔", "난자먹어", "난자핧아", "내꺼빨아", "내꺼핧아", "너거애비", "노무노무", "누나강간", "니씨브랄", "니아범?", "니할애비", "대애가리", "대에가리", "더어엉신", "더러운년", "덜은새끼", "돌은새끼", "동생강간", "뒤이치기", "뒤져야지", "뒤지고싶", "뒷잇치기", "드으응신", "따먹는다", "따먹었어", "따먹었지", "따먹을까", "따알따리", "떠어라이", "또오라이", "띠부우울", "띠이바알", "띠이버얼", "띠이이발", "띠이이벌", "맛없는년", "맛이간년", "미시친발", "미친구녕", "미친구멍", "미친새끼", "미친쉐이", "버어어지", "버어지이", "버지구녕", "버지구멍", "버지냄새", "버지뚫어", "버지뜨더", "버지벌려", "버지벌료", "버지빨아", "버지빨어", "버지썰어", "버지쑤셔", "버지핧아", "병신세리", "병신셰리", "병신씨발", "보지구녕", "보지구멍", "보지뚫어", "보지뜨더", "보지박어", "보지벌려", "보지벌료", "보지벌리", "보지보지", "보지빨아", "보지빨어", "보지자지", "보지정액", "보지찌져", "보지찢어", "보지털어", "보지핧아", "보지핧어", "뷰우웅신", "뷰웅시인", "빙신쉐이", "빠가야로", "빠가십새", "빠가씹새", "빠아구리", "빠아아라", "사까시이", "사까아시", "새77ㅣ", "성교하자", "섹스하자", "쉬이이이", "시미발친", "시미친발", "시바라지", "시바시바", "시박색히", "시박쉑히", "시발새끼", "시방색희", "시방쉑희", "시새발끼", "시입세에", "시친발미", "시팍새끼", "시팔새끼", "십탱구리", "십탱굴이", "십팔새끼", "싸가지없", "쌍쌍보지", "쓰래기같", "쓰레기새", "쓰바새끼", "씨가랭넘", "씨가랭년", "씨가랭놈", "씨박색희", "씨박색히", "씨박쉑히", "씨발병신", "씨뱅가리", "씨벌쉐이", "씨븡새끼", "씨새발끼", "씨입새에", "씨입세에", "씨팍새끼", "씨팍세끼", "씨퐁보지", "씨퐁자지", "씹탱굴이", "아아가리", "아오ㅅㅂ", "아오시바", "애미보지", "애미씨뱅", "애미자지", "애미잡년", "애미좃물", "어미강간", "엿먹어라", "오르가즘", "왕털버지", "왕털보지", "왕털자지", "왕털잠지", "유두빨어", "유두핧어", "유방만져", "유방빨아", "유방핧아", "유방핧어", "유우까압", "자기핧아", "자지구녕", "자지구멍", "자지꽂아", "자지넣자", "자지뜨더", "자지뜯어", "자지박어", "자지빨아", "자지빨어", "자지쑤셔", "자지정개", "자지짤라", "자지핧아", "자지핧어", "작은보지", "잠지뚫어", "젓대가리", "젓물냄새", "정액마셔", "정액먹어", "정액발사", "정액핧아", "정자마셔", "정자먹어", "정자핧아", "조개보지", "조개속물", "조오가튼", "조오까튼", "조오오조", "조오온니", "조오올라", "조온마니", "조옴마니", "조우까튼", "좀쓰레기", "좁빠라라", "좃가튼뇬", "좃대가리", "좃마무리", "좃만한것", "좃물냄새", "좃빠구리", "좃빠라라", "좆같은놈", "좆만한년", "좆만한놈", "좋만한것", "주둥아리", "지이라알", "쪼다새끼", "창녀버지", "창년벼지", "캐럿닷컴", "항문수셔", "항문쑤셔", "허버리년", "허벌보지", "허벌자식", "허벌자지", "헐렁보지", "호로새끼", "호로자슥", "호로자식", "호루자슥", "후라덜넘", "후우자앙", "후장꽂아", "후장뚫어", "18년", "18놈", "d쥐고", "d지고", "me췬", "me친", "me틴", "mi친", "mi틴", "ya동", "ㅁㅣ췬", "ㅂㅁㄱ", "ㅅ.ㅂ", "ㅅㄲ네", "ㅅㄲ들", "ㅅㅡ루", "ㅆㄹㄱ", "ㅆㅣ8", "ㅆㅣ댕", "ㅆㅣ뎅", "ㅆㅣ바", "ㅆㅣ발", "ㅇㅒ쁜", "ㅈ.ㄴ", "ㅈㅏ위", "ㅉ질한", "ㄱㅅㄲ", "개.웃", "개가튼", "개같이", "개걸래", "개걸레", "개고치", "개너미", "개라슥", "개마이", "개보지", "개부달", "개부랄", "개불랄", "개붕알", "개새기", "개새끼", "개색뀌", "개색휘", "개샛기", "개소리", "개쉐뀌", "개씁년", "개씁블", "개씨발", "개씨블", "개아기", "개자식", "개자지", "개잡년", "개저씨", "개저엇", "개지랄", "개후라", "걔잡년", "거시기", "걸래년", "걸레년", "게가튼", "게부럴", "게저엇", "계새끼", "괘새끼", "괴가튼", "굿보지", "김대중", "김치녀", "깨쌔끼", "나빼썅", "내미랄", "내미럴", "내버지", "내씨발", "내자지", "내잠지", "내조지", "노네들", "노알라", "노무현", "느그매", "니기미", "니미기", "니미랄", "니미럴", "니아범", "니애미", "니애비", "닝기리", "닥쳐라", "닥치세", "달달이", "달딸이", "닳은년", "대가리", "대음순", "더엉신", "돈새끼", "돌았네", "돌으년", "뒤져라", "뒤져버", "뒤져야", "뒤져요", "뒤지겠", "뒤지길", "뒤진다", "뒤치기", "뒷치기", "드응신", "디져라", "디지고", "따먹기", "따먹어", "따먹자", "딸달이", "딸딸이", "떠라이", "또라이", "또라인", "똘아이", "띠발뇬", "띠부울", "띠브울", "띠블넘", "띠이발", "띠이벌", "막간년", "맛간년", "미쳣네", "미쳤나", "미쳤니", "미치인", "미친ㅋ", "미친개", "미친넘", "미친년", "미친놈", "미친눔", "미친새", "미친색", "미티넘", "미틴것", "방점뱅", "백보지", "버어지", "버지털", "버짓물", "보지녀", "보지물", "보지털", "보짓물", "뷰웅신", "빠가냐", "빠간가", "빠가새", "빠가니", "빠구리", "빠구울", "빠굴이", "빠아가", "빡새끼", "빨치산", "사까쉬", "사까시", "사새끼", "새ㄲㅣ", "새끼라", "새끼야", "성교해", "성폭행", "세엑스", "세엑쓰", "섹스해", "소음순", "쉬방새", "쉬이바", "쉬이이", "쉽알넘", "슈ㅣ발", "슈우벌", "슨상님", "시댕이", "시바류", "시바알", "시바앙", "시발년", "시발놈", "시방새", "시벌탱", "시볼탱", "시부럴", "시부렬", "시부울", "시뷰럴", "시뷰렬", "시이발", "시입세", "시키가", "시팔넘", "시팔년", "시팔놈", "십버지", "십부랄", "십부럴", "십세리", "십세이", "십셰리", "십쉐끼", "십자석", "십자슥", "십지랄", "십창녀", "십팔넘", "싸가지", "싸물어", "쌍보지", "쌔엑스", "쎄엑스", "씨ㅂㅏ", "씨댕이", "씨바라", "씨바알", "씨발년", "씨발롬", "씨방새", "씨방세", "씨버럼", "씨벌년", "씨벌탱", "씨볼탱", "씨부랄", "씨부럴", "씨부렬", "씨불알", "씨뷰럴", "씨뷰렬", "씨브럴", "씨블년", "씨빠빠", "씨섹끼", "씨이발", "씨입새", "씨입세", "씨파넘", "씨팍넘", "씨퐁넘", "씨퐁뇬", "씹미랄", "씹버지", "씹보지", "씹부랄", "씹브랄", "씹빵구", "씹뻐럴", "씹뽀지", "씹새끼", "씹쉐뀌", "씹쌔끼", "씹자석", "씹자슥", "씹자지", "씹지랄", "씹창녀", "씹탱이", "씹팔넘", "아가리", "애미랄", "애애무", "애에무", "애에미", "애에비", "에애무", "에에무", "에에미", "에에비", "여어엄", "여엄병", "염병할", "엿이나", "왕버지", "왕자지", "왕잠지", "왜저럼", "유우깝", "유우방", "은새끼", "이새끼", "자압것", "자지털", "잠지털", "젓같내", "젓냄새", "젓만이", "정액짜", "젖탱이", "졌같은", "조가튼", "조오또", "조오웃", "조오지", "조온나", "조온니", "조온만", "조올라", "조옷만", "족같내", "족까내", "존.나", "존ㄴ나", "존나아", "존마니", "좀마니", "좃간년", "좃까리", "좃깟네", "좃냄새", "좃만아", "좃만이", "좃보지", "좃부랄", "좃빠네", "좆까라", "좆만아", "좆먹어", "좆빨아", "좆새끼", "좋오웃", "죠온나", "주글년", "주길년", "주둥이", "줬같은", "지껄이", "ㅈ1랄", "지이랄", "쪽바리", "찝째끼", "쳐받는", "쳐발라", "친구년", "친노마", "큰보지", "페니스", "허벌년", "허벌레", "허어벌", "호냥년", "호로자", "호로잡", "화낭년", "화냥년", "후.려", "후라덜", "후우장", "미칭럼", "느금마", "ㅈ같네", "ㅁㅊ", "ㅁ친", "ㅂㄹ", "ㅂㅊ", "ㅂ크", "ㅅㅂ", "ㅅㅍ", "ㅅㅋ", "ㅅ루", "ㅅ발", "ㅆㄺ", "ㅆㅂ", "ㅆㅣ", "ㅈㄴ", "ㅈㄹ", "ㅈ리", "강간", "개간", "개같", "개넷", "개년", "개놈", "개독", "개련", "개섹", "개셈", "개젓", "개좆", "개쩌", "게젓", "골빈", "공알", "구씹", "귀두", "꼭지", "년놈", "뇌텅", "뇨온", "늬믜", "늬미", "니년", "니믜", "니미", "닥쳐", "대갈", "돈년", "뒈져", "뒤졌", "뒤질", "등신", "디졌", "디질", "딴년", "띠바", "띠발", "띠벌", "띠벨", "띠불", "띠블", "런년", "럼들", "롬들", "맘충", "머갈", "믜칀", "믜친", "미띤", "미췬", "미칀", "미친", "미틴", "및힌", "발놈", "벌창", "벵신", "별창", "병닥", "병딱", "병맛", "병신", "병크", "보지", "봉알", "부랄", "불알", "붕신", "붕알", "븅신", "브랄", "빙띤", "빙신", "빠굴", "빠네", "빠라", "빠큐", "빻았", "빻은", "뻐규", "뻐큐", "뻑유", "뻑큐", "뻨큐", "뼈큐", "뽀지", "상년", "새끼", "새퀴", "새킈", "새키", "색희", "색히", "샊기", "샊히", "샹년", "섀키", "성괴", "성교", "세끼", "세키", "섹끼", "섹스", "쇅끼", "쇡끼", "쉐끼", "쉬박", "쉬발", "쉬버", "쉬빡", "쉬탱", "쉬팍", "쉬펄", "쉽세", "슈발", "슈벌", "스벌", "싑창", "시바", "시파", "시발", "시벌", "시빡", "시빨", "시탱", "시팍", "시팔", "시펄", "십녀", "십새", "십세", "십창", "십탱", "십팔", "싹스", "쌍년", "쌍놈", "쌔끼", "쌕스", "쌕쓰", "썅놈", "썅년", "썌끼", "쎄끼", "쎄리", "쎅스", "쎅쓰", "쒸8", "쒸댕", "쒸발", "쒸팔", "쒸펄", "쓰댕", "쓰뎅", "쓰렉", "쓰루", "쓰바", "쓰발", "쓰벌", "쓰벨", "쓰파", "씌8", "씌댕", "씌뎅", "씌발", "씌벨", "씌팔", "씝창", "씨8", "씨걸", "씨댕", "씨뎅", "씨바", "씨발", "씨벌", "씨벨", "씨블", "씨븡", "씨비", "씨빡", "씨빨", "씨뻘", "씨입", "씨팍", "씨팔", "씨퐁", "씹귀", "씹년", "씹덕", "씹못", "씹물", "씹새", "씹세", "씹쌔", "씹창", "씹치", "씹탱", "씹팔", "씹할", "아닥", "애무", "애미", "애비", "앰창", "야동", "엄창", "에무", "에미", "에비", "엠생", "엠창", "염병", "염뵹", "엿같", "옘병", "외퀴", "요년", "유깝", "유두", "유방", "육갑", "은년", "음경", "이년", "자위", "자지", "잠지", "짬지", "잡것", "잡년", "잡놈", "저년", "저엇", "저엊", "적까", "절라", "점물", "젓까", "젓떠", "젓물", "젓밥", "젖같", "젖까", "젗같", "젼나", "젼낰", "졏같", "조깟", "조또", "조온", "족까", "존귀", "존귘", "존나", "존낙", "존내", "존니", "존똑", "존맛", "존멋", "존버", "존싫", "존쎄", "존쎼", "존예", "존웃", "존잘", "존잼", "존좋", "존트", "졸귀", "졸귘", "졸라", "졸맛", "졸멋", "졸싫", "졸예", "졸웃", "졸잼", "졸좋", "좀물", "좁밥", "좃까", "좃넘", "좃도", "좃또", "좃물", "좃털", "종나", "좆까", "좆나", "좆년", "좆도", "좆물", "좆밥", "좆털", "좋만", "죠낸", "죤나", "죤내", "죵나", "쥐랄", "쥰나", "쥰내", "쥰니", "쥰트", "즤랄", "지랄", "지럴", "지롤", "지뢀", "지뢰", "짱깨", "짱께", "쪼녜", "쪼다", "쪽발", "쫓같", "쬰잘", "창남", "창녀", "창년", "창놈", "처먹", "첫빠", "쳐마", "쳐먹", "취ㅈ", "취좃", "친년", "친놈", "파친", "펑글", "항문", "허벌", "호로", "후려", "후장", "꽃휴", "ㅂㅅ", "걔섀", "느금", "늑음", "ㅈ같", "ㅄ", "凸", "뇬", "썅", "씹", "좃", "좆", "좇", "죶", "쫂", "쬲", "rosy palm and her 5 sisters", "son of a motherless goat", "fuckingshitmotherfucker", "leather straight jacket", "two fingers with tongue", "prince albert piercing", "missionary position", "alabama hot pocket", "chocolate rosebuds", "double penetration", "chick with a dick", "cleveland steamer", "leather restraint", "one cup two girls", "two girls one cup", "wrinkled starfish", "alaskan pipeline", "bang (one's) box", "female squirting", "one guy one jar", "reverse cowgirl", "taking the piss", "acrotomophilia", "beaver cleaver", "blow your load", "carpet muncher", "male squirting", "menage a trois", "motherfuckings", "mound of venus", "pleasure chest", "rusty trombone", "son of a bitch", "son of a whore", "son-of-a-bitch", "yellow showers", "2 girls 1 cup", "beef curtains", "brotherfucker", "brown showers", "carpetmuncher", "clitty litter", "clover clamps", "cop some wood", "dingleberries", "dirty pillows", "dirty sanchez", "fingerfuckers", "fingerfucking", "fingerfucking", "gender bender", "golden shower", "how to murdep", "how to murder", "masterbations", "mothafuckings", "mother fucker", "mother fucker", "motherfuckers", "motherfucking", "need the dick", "piece of shit", "sausage queen", "shaved beaver", "splooge moose", "suicide girls", "whorealicious", "window licker", "anal impaler", "anal leakage", "ball licking", "ball sucking", "barely legal", "beef curtain", "big knockers", "bunny fucker", "child-fucker", "cockmongruel", "cum dumpster", "cum dumpster", "cyberfuckers", "cyberfucking", "cyberfucking", "dawgie-style", "dendrophilia", "doggie style", "doggie-style", "donkey punch", "donkeyribber", "douchewaffle", "eat hair pie", "eat hair pie", "ejaculatings", "fingerfucked", "fingerfucked", "fingerfucker", "fingerfucker", "fistfuckings", "fistfuckings", "flog the log", "fuck buttons", "fuck yo mama", "fuck yo mama", "fuckersucker", "fudge packer", "fudge-packer", "goldenshower", "homodumbshit", "iberian slap", "jungle bunny", "make me come", "masterbating", "masterbation", "masturbating", "masturbation", "microphallus", "mothafuckers", "mothafucking", "mothafucking", "motherfucked", "motherfucker", "motherfuckin", "motherfuckka", "muthafuckker", "mutherfucker", "porch monkey", "pussy palace", "pussy palace", "pussylicking", "pussypounder", "raging boner", "shaved pussy", "sultry women", "sumofabiatch", "tittiefucker", "urethra play", "vorarephilia", "auto erotic", "baby batter", "beardedclam", "beastiality", "beaver lips", "blue waffle", "blue waffle", "bullet vibe", "bullshitted", "bust a load", "butt-pirate", "chi-chi man", "clit licker", "clusterfuck", "cock pocket", "cock sucker", "cockholster", "cockknocker", "cockmongler", "cockmuncher", "cocksniffer", "cock-sucker", "cocksuckers", "cocksucking", "coprolagnia", "coprophilia", "cum chugger", "cum chugger", "cum guzzler", "cum guzzler", "cumdumpster", "cunillingus", "cunnilingus", "cuntlicking", "cuntlicking", "cunt-struck", "cunt-struck", "cyberfucked", "cyberfucked", "cyberfucker", "deep throat", "dickbeaters", "dickflipper", "dick-sneeze", "dicksucking", "dicktickler", "dickwhipper", "dingleberry", "doggiestyle", "doggy style", "doggy-style", "donkeypunch", "double dong", "ejaculating", "ejaculating", "ejaculation", "f u c k e r", "fannybandit", "fannyfucker", "fartknocker", "fingerfucks", "fingerfucks", "fistfuckers", "fistfuckers", "fistfucking", "fistfucking", "foot fetish", "fuck puppet", "fuck puppet", "fuck trophy", "fuck trophy", "fudgepacker", "hardcoresex", "intercourse", "junglebunny", "lemon party", "master-bate", "master-bate", "mothafuckas", "mothafuckaz", "mothafucked", "mothafucked", "mothafucker", "mothafuckin", "motherfucka", "motherfucks", "muthafecker", "nimphomania", "nsfw images", "nymphomania", "pedophiliac", "penisbanger", "penisfucker", "penispuffer", "pillowbiter", "pole smoker", "porchmonkey", "pornography", "prickteaser", "sand nigger", "shit fucker", "shit fucker", "shitspitter", "slut bucket", "slut bucket", "spread legs", "style doggy", "tea bagging", "thundercunt", "tittyfucker", "two fingers", "unclefucker", "venus mound", "violet wand", "whorehopper", "asscracker", "ass-fucker", "ass-jabber", "assmuncher", "ass-pirate", "autoerotic", "baby juice", "ball gravy", "bestiality", "black cock", "bloodclaat", "booooooobs", "booty call", "bumblefuck", "buttcheeks", "buttfucker", "c0cksucker", "chota bags", "chota bags", "circlejerk", "cockburger", "cockfucker", "cockjockey", "cockknoker", "cockmaster", "cockmonkey", "cocknugget", "cocksmoker", "cocksucked", "cocksucked", "cocksucker", "cockwaffle", "cokmuncher", "corksucker", "corp whore", "corp whore", "crackwhore", "cumguzzler", "cunilingus", "cunthunter", "cuntlicker", "cuntlicker", "deepthroat", "dickdipper", "dickfucker", "dickmonger", "dickripper", "dicksipper", "dicksucker", "dickweasel", "dickzipper", "dog-fucker", "doggystyle", "dominatrix", "douchebags", "douche-fag", "eat a dick", "eat a dick", "eat my ass", "ejaculated", "ejaculates", "ejaculates", "faggotcock", "fannyflaps", "fingerbang", "fingerfuck", "fingerfuck", "fistfucked", "fistfucked", "fistfucker", "fistfucker", "fleshflute", "fuck-bitch", "fuck-bitch", "fuckbutter", "fucknugget", "gangbanged", "gayfuckist", "giant cock", "god-damned", "homoerotic", "kunilingus", "lovemaking", "m45terbate", "ma5terbate", "masterbat*", "masterbat3", "masterbate", "masturbate", "mothafucka", "mothafucks", "motherfuck", "muff diver", "muffdiving", "p.u.s.s.y.", "paedophile", "peckerhead", "pedophilia", "polesmoker", "poop chute", "poopuncher", "prostitute", "pussy fart", "pussy fart", "sandnigger", "scissoring", "shitbagger", "shitbrains", "shitbreath", "shitcanned", "slutdumper", "strip club", "teabagging", "twatwaffle", "undressing", "whorehouse", "analprobe", "anilingus", "assbandit", "assbanged", "assbanger", "assfucker", "assgoblin", "asshopper", "assjacker", "asslicker", "assmaster", "assmonkey", "assnigger", "asspirate", "asssucker", "ball sack", "barenaked", "bastinado", "batty boy", "bescumber", "bitch tit", "bitchtits", "bull shit", "bullshits", "bullturds", "bung hole", "butt fuck", "butt plug", "buttfucka", "buttmunch", "camel toe", "chesticle", "cock snot", "cockblock", "cockmunch", "cocksmith", "cocksmoke", "cocksucks", "cocksucks", "cocksukka", "cum freak", "cum freak", "cumbubble", "cumjockey", "cunt hair", "cunt hair", "cuntsicle", "cuntsicle", "cyberfuck", "cyberfuck", "date rape", "dick head", "dick hole", "dick hole", "dickheads", "dickjuice", "dog style", "douchebag", "dp action", "dumbasses", "ejaculate", "ejakulate", "fagfucker", "fist fuck", "fist fuck", "fistfucks", "fistfucks", "fuck hole", "fuck hole", "fuckbrain", "fuckheads", "fuckstick", "fuck-tard", "fucktards", "gang bang", "gang-bang", "gang-bang", "gangbangs", "gassy ass", "gassy ass", "goddamned", "goddamnit", "group sex", "hot chick", "jackasses", "jail bait", "jiggerboo", "knobjocky", "knobjokey", "m-fucking", "mothafuck", "muff puff", "muff puff", "muffdiver", "nob jokey", "octopussy", "pedophile", "phone sex", "pigfucker", "pissflaps", "poopchute", "queerbait", "queerhole", "rosy palm", "shitblimp", "shiteater", "shitfaced", "shitheads", "shithouse", "shitstain", "shittiest", "shittings", "skullfuck", "strappado", "threesome", "throating", "tittyfuck", "tittywank", "towelhead", "tribadism", "urophilia", "wet dream", "wh0reface", "whoreface", "zoophilia", "arsehole", "ass fuck", "ass hole", "assbangs", "assclown", "assfaces", "assfukka", "assholes", "assmucus", "assmucus", "assmunch", "assshole", "asswhole", "asswipes", "ball gag", "ballsack", "bangbros", "bastardo", "bastards", "beastial", "beeyotch", "big tits", "birdlock", "bitchass", "bitchers", "bitching", "blow job", "blow mud", "blowjobs", "blumpkin", "bollocks", "booooobs", "bulldyke", "bullshit", "bunghole", "buttfuck", "buttmuch", "buttplug", "c.o.c.k.", "cameltoe", "camwhore", "choc ice", "clitface", "clitfuck", "clitorus", "cockbite", "cockface", "cockhead", "cocklump", "cocknose", "cockshit", "cocksuck", "cocksuck", "cocksuka", "coksucka", "coonnass", "cornhole", "cornhole", "cumshots", "cumstain", "cuntface", "cunthole", "cuntlick", "cuntlick", "cuntslut", "cyberfuc", "daterape", "dick shy", "dick shy", "dickface", "dickfuck", "dickhead", "dickhole", "dick-ish", "dickmilk", "dickslap", "dickweed", "doochbag", "dry hump", "dumb ass", "dumbcunt", "dumbfuck", "dumbshit", "erection", "essohbee", "felching", "fellatio", "feltcher", "fistfuck", "foreskin", "frotting", "fuck off", "fuck you", "fuck-ass", "fuck-ass", "fuckbutt", "fuckedup", "fuckface", "fuckhead", "fuckhole", "fuckings", "fuckmeat", "fuckmeat", "fucknutt", "fucktard", "fucktart", "fucktwat", "fuckwhit", "fuckwitt", "futanari", "gangbang", "godsdamn", "goo girl", "goodpoop", "goregasm", "hand job", "horniest", "hot carl", "jack off", "jackhole", "jack-off", "jailbait", "jerk off", "jerk-off", "jiggaboo", "kinkster", "knobhead", "ma5terb8", "masterb8", "mcfagget", "nobjocky", "nobjokey", "numbnuts", "nut sack", "omorashi", "orgasims", "orgasmic", "pedobear", "phonesex", "phukking", "piss pig", "ponyplay", "poontang", "retarded", "s.h.i.t.", "shagging", "shit ass", "shitcunt", "shitdick", "shitface", "shitfuck", "shitfull", "shithead", "shithole", "shitings", "shitters", "shitters", "shittier", "shitting", "slanteye", "slutkiss", "sodomize", "strap on", "testical", "testicle", "tit wank", "tit wank", "tub girl", "twathead", "twatlips", "vajayjay", "veqtable", "whorebag", "a$$hole", "a55hole", "apeshit", "assbang", "assbite", "asscock", "assface", "assfuck", "assh0le", "ass-hat", "asshead", "assho1e", "asshole", "asslick", "assshit", "asswipe", "axwound", "ballbag", "bastard", "beaners", "bellend", "bestial", "bigtits", "bitched", "bitcher", "bitches", "bitchin", "blow me", "blowjob", "boiolas", "bollock", "bondage", "boobies", "boooobs", "breasts", "bumclat", "c.0.c.k", "c.u.n.t", "c-0-c-k", "camgirl", "camslut", "c-o-c-k", "cockass", "cockeye", "coochie", "cripple", "cumdump", "cumdump", "cumming", "cumshot", "cumslut", "cumtart", "c-u-n-t", "cuntass", "cuntbag", "cuntbag", "cuntrag", "dickbag", "dickish", "dickwad", "dickwod", "diligaf", "dipship", "dipshit", "dogging", "dolcett", "douchey", "dumbass", "dumshit", "erotism", "f u c k", "f.u.c.k", "f_u_c_k", "fagging", "faggitt", "faggots", "fagtard", "fcuking", "felcher", "fellate", "fisting", "footjob", "f-u-c-k", "fuckass", "fuckbag", "fuckboy", "fuckers", "fucking", "fucknut", "fuckoff", "fucktoy", "fucktoy", "fuckwad", "fuckwit", "fukkers", "fukwhit", "gay sex", "gayfuck", "gaytard", "goddamn", "handjob", "humping", "jackass", "jackoff", "jerk0ff", "jerkass", "jerkoff", "jigaboo", "kinbaku", "knobead", "knobend", "kooches", "lameass", "lardass", "mafugly", "mafugly", "nawashi", "nig nog", "nigaboo", "niggers", "nig-nog", "nobhead", "nutsack", "orgasim", "orgasms", "pegging", "phallic", "phuking", "phukked", "pisspig", "pollock", "poonani", "poonany", "punanny", "pussies", "raghead", "reetard", "rimming", "s_h_i_t", "schlong", "s-h-1-t", "shagger", "shaggin", "shemale", "shibari", "s-h-i-t", "shitass", "shitbag", "shiting", "shitted", "shitter", "shiznit", "slutbag", "sod off", "splooge", "strapon", "suckass", "t1tt1e5", "t1tties", "titfuck", "tittie5", "titties", "titwank", "tubgirl", "twunter", "upskirt", "vjayjay", "wankjob", "wetback", "whoring", "assbag", "asshat", "asswad", "azazel", "bampot", "beaner", "beatch", "beotch", "biatch", "bimbos", "bitchy", "bollok", "bollox", "boners", "booger", "booobs", "bootee", "bootie", "boozer", "bosomy", "buceta", "bugger", "bummer", "chincs", "chinky", "choade", "choade", "chodes", "clitty", "clunge", "coital", "commie", "coochy", "cooter", "crappy", "cretin", "crikey", "crotte", "cummer", "cummin", "cunnie", "cyalis", "d0uch3", "d0uche", "dammit", "dildos", "doggin", "dommes", "doofus", "dookie", "douch3", "douche", "dumass", "erotic", "escort", "extacy", "extasy", "fagbag", "fagged", "faggit", "faggot", "fagots", "fatass", "fcuker", "feltch", "femdom", "fenian", "fisted", "floozy", "fondle", "fooker", "fucked", "fucker", "fuckin", "fuckme", "fuckme", "fuckup", "fukker", "fukkin", "fukwit", "gayass", "gaybob", "gaysex", "gaywad", "gigolo", "goatcx", "goatse", "gokkun", "g-spot", "hentai", "heroin", "herpes", "homoey", "honkey", "hooker", "hotsex", "humped", "inbred", "incest", "jerked", "jizzed", "knobed", "kootch", "l3i+ch", "l3itch", "lezzie", "lolita", "molest", "moolie", "murder", "muther", "n1gger", "nambla", "nigg3r", "nigg4h", "niggah", "niggas", "niggaz", "nigger", "niglet", "nudity", "nympho", "opiate", "orgasm", "orgies", "peepee", "penial", "penile", "phuked", "pimpis", "polack", "pornos", "pricks", "punani", "punany", "pussys", "queero", "raping", "rapist", "raunch", "retard", "rimjaw", "rimjob", "ritard", "r-tard", "s.o.b.", "sadism", "sadist", "schizo", "scroat", "scrote", "shited", "shitey", "shitty", "smutty", "sodomy", "spooge", "stiffy", "stoned", "testee", "testes", "testis", "tities", "tosser", "tranny", "twatty", "undies", "v14gra", "vagina", "va-j-j", "wanker", "whored", "whores", "wigger", "yeasty", "a_s_s", "ahole", "arrse", "asses", "b!tch", "b00bs", "b17ch", "b1tch", "bi+ch", "bimbo", "bitch", "boned", "boner", "boobs", "booby", "boong", "booze", "boozy", "bosom", "busty", "chinc", "chink", "choad", "chode", "clits", "coons", "cunny", "cunts", "d1ld0", "d1ldo", "dicks", "dildo", "doosh", "dopey", "erect", "f4nny", "faggs", "fagot", "faigt", "fanyy", "fecal", "felch", "fisty", "fubar", "fucka", "fucks", "fuker", "fux0r", "gaydo", "gippo", "glans", "gooks", "gspot", "hobag", "honky", "horny", "juggs", "kafir", "kikes", "kooch", "labia", "leper", "lezza", "mo-fo", "moron", "mutha", "n1gga", "negro", "nigga", "nonce", "opium", "penis", "phuck", "phuks", "porno", "potty", "prick", "pubes", "pubic", "pubis", "pusse", "pussi", "pussy", "queaf", "queaf", "queef", "raped", "raper", "rapey", "renob", "rtard", "s hit", "scrog", "scrot", "semen", "shite", "shits", "shitt", "shota", "slave", "sluts", "snuff", "s-o-b", "spook", "spunk", "teets", "teste", "titty", "tramp", "tushy", "twats", "twunt", "v1gra", "vixen", "vulva", "wanky", "wazoo", "wh0re", "whoar", "whore", "yiffy", "yobbo", "zibbi", "2g1c", "4r5e", "5h1t", "5hit", "anal", "ar5e", "arse", "barf", "bdsm", "bint", "bong", "boob", "bung", "c0ck", "cawk", "cipa", "cl1t", "clit", "cnut", "coon", "crap", "cums", "cunt", "d0ng", "d1ck", "dick", "dlck", "fack", "fagg", "fags", "faig", "fcuk", "foad", "fuck", "fuck", "fuks", "fvck", "fxck", "gtfo", "h0m0", "h0mo", "hoer", "hom0", "hore", "japs", "jerk", "jism", "jizm", "jizm", "jizz", "jock", "kike", "kunt", "kwif", "kyke", "lube", "m0f0", "m0fo", "meth", "milf", "mof0", "mofo", "nude", "orgy", "p0rn", "paki", "phuk", "phuq", "pimp", "poof", "poon", "porn", "prig", "pron", "pthc", "pube", "puss", "quim", "rape", "scum", "seks", "sexo", "sh!+", "sh!t", "sh1t", "shag", "shi+", "shit", "shiz", "slut", "smut", "stfu", "taff", "taig", "tard", "teat", "teez", "titi", "tits", "titt", "turd", "tush", "tw4t", "twat", "wang", "wank", "yaoi", "zubb", "a$$", "a2m", "a55", "ass", "azz", "bbw", "cok", "cum", "fag", "fuc", "gfy", "jap", "jiz", "jiz", "pee", "s0b", "sex", "t1t", "tit", "vag", "wad", "wog", "wop", "wtf", "yid");

var swear_alert_arr = new Array;
var swear_alert_count = 0;
function reset_alert_count() {
   swear_alert_count = 0;
}

function validate_text() {

   // 가입부분 체크 
   let namechk = document.getElementById("namechk").value;
   let nickname = document.getElementById("nickname").value;
   let id = document.getElementById("id").value;
   let pwd = document.getElementById("pwd").value;
   let pwdChk = document.getElementById("pwdChk").value;
   let email = document.getElementById("email").value;
   let phone_num = document.getElementById("phone_num").value;
   let check = true;
   let idvalcheck = /^[a-z0-9]+$/
   let pwdcheck = /^[a-zA-Z0-9]+$/

   let num = /[0-9]/
   let eng = /[a-z]/
   let spe = /[`~!@@#$%^&*|₩₩₩'₩";:₩/?]/

   let mailCheck = /^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*.[a-zA-Z]{2,3}$/i;
   let pwdOK = /^(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,15}$/;

   // 이름확인
   if (namechk === "") {
      document.getElementById("nameError").innerHTML = "이름은 필수 정보입니다."
      return false;
   } else if (spe.test(namechk) || namechk.length > 10) {
      document.getElementById("nameError").innerHTML = "이름을 정확히 입력해주세요."
      return false;
   } else {
      document.getElementById("nameError").innerHTML = ""
   }

   //아이디
   if (id === "") {
      document.getElementById("idError").innerHTML = "아이디는 필수 정보입니다."
      return false;
   } else {
      document.getElementById("idError").innerHTML = "멋진 아이디네요!"
   }

   //닉네임
   if (nickname === "") {
      document.getElementById("nicknameError").innerHTML = "별명은 필수 정보입니다."
      return false;
   } else {
      document.getElementById("nicknameError").innerHTML = "멋진 별명이네요!"
   }

   //욕설 감지
   reset_alert_count();
   var compare_text = document.form1.nickname.value;
   for (var i = 0; i < swear_words_arr.length; i++) {
      for (var j = 0; j < (compare_text.length); j++) {
         if (swear_words_arr[i] == compare_text.substring(j, (j + swear_words_arr[i].length)).toLowerCase()) {
            swear_alert_arr[swear_alert_count] = compare_text.substring(j, (j + swear_words_arr[i].length));
            swear_alert_count++;
         }
      }
   }
   var alert_text = "";
   for (var k = 1; k <= swear_alert_count; k++) {
      alert_text += "\\n" + "(" + k + ")  " + swear_alert_arr[k - 1];
   }

   if (swear_alert_count > 0) {
      alert("닉네임에서 욕설이 감지 되었습니다.\\n다른 사용자의 불쾌감을 조성할 수 있으니 다시 입력해주세요.:\\n_______________________________\\n" + alert_text + "\\n_______________________________");
      //document.form1.nickname.select();
      document.getElementById("nicknameError").innerHTML = "닉네임에서 욕설이 감지되었습니다. 다시 입력해주세요."
      return false;
   } else {
      document.getElementById("nicknameError").innerHTML = ""
   }

   // 비밀번호 확인
   if (pwd === "") {
      document.getElementById("pwdError").innerHTML = "비밀번호를 입력해주세요."
      return false;
   } else if (!pwdOK.test(pwd)) {
      document.getElementById("pwdError").innerHTML = "8~15자의 영문 소문자, 숫자, 사용 가능한"+'<br>'+" 특수문자만을 필수로 모두 조합하여 입력해주세요"
      return false;
   } else {
      document.getElementById("pwdError").innerHTML = ""
   }

   if (pwd !== pwdChk) {
      document.getElementById("pwdError").innerHTML = ""
      document.getElementById("pwdChkError").innerHTML = "비밀번호가 동일하지 않습니다."
      return false;
   } else {
      document.getElementById("pwdError").innerHTML = ""
      document.getElementById("pwdChkError").innerHTML = ""
   }

   if (pwdChk === "") {
      document.getElementById("pwdChkError").innerHTML = "비밀번호를 다시 입력해주세요."
      return false;
   } else {
      document.getElementById("pwdChkError").innerHTML = ""
   }

   if (email === "") {
      document.getElementById("emailError").innerHTML = ""
   } else if ((email.match(mailCheck) == null)) {
      document.getElementById("emailError").innerHTML = "이메일을 정확히 입력해주세요."
      return false;
   } else {
      document.getElementById("emailError").innerHTML = ""
   }

   //전화번호
   if (phone_num === "") {
      document.getElementById("phoneNumError").innerHTML = "전화번호는 필수 정보입니다."
      return false;
   } else {
      document.getElementById("phoneNumError").innerHTML = ""
   }

}
function select_area() {
   document.form1.nickname.select();
}
window.onload = reset_alert_count;

SignUp2.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ include file="../Page/Header.jsp"%>


<!DOCTYPE html>
<html lang="ko">

<head>


<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>signup_2</title>
<link rel="stylesheet" href="./css/SignUp.css">
<link
    href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css"
    rel="stylesheet"
    integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3"
    crossorigin="anonymous">


</head>

<body>
    <%
    request.setCharacterEncoding("UTF-8");
    String user_id = (String) session.getAttribute("UserId");
    System.out.print(user_id + "확인");

    if (user_id != null) {
        out.println("<script>alert('로그아웃 후 사용해주세요.'); location.href='tradeListPage.do?category=7';</script>");
    }
    %>

    <section style="margin: 0 15% 15% 15%">
        <div class="signup_title">회원가입</div>
        <div class="step_title">
            <p>1 약관동의</p>
            <p class="step_point_2">2 정보입력</p>
            <p>3 가입 완료</p>
        </div>
        <hr style="margin-top: 0px">
        <div class="step_ments_1">
            <p class="step_ment_1">회원 정보를 정확히 입력해주세요.</p>
            <p class="step_ment_1">모두 입력하셔야 가입할 수 있습니다.</p>
            <p class="step_ment_1">안 될 시 1:1 문의에 문의해주시길 바랍니다.</p>
        </div>
        <hr>
        <div class="essential_ments">
            <span style="color: red">*</span>필수 입력 정보입니다.
        </div>

        <form name="form1" method="post" action="../Page/SignUp2.do"
            onsubmit="return validate_text()">
            <div class="form_style">
                <div class="input_style">
                    이름&nbsp;<span style="color: red">*</span> <input class="input_body"
                        size=50 maxlength="20" type="text" name="name" placeholder="이름"
                        id="namechk" />
                    <div id="nameError" class="error"></div>
                </div>

                <div class="input_style">
                    아이디&nbsp;<span style="color: red">*</span>
                    <div class="btn-input">
                        <input type="text" id="id" class="input_body" size=50
                            maxlength="20" name="user_id"
                            placeholder="'ID중복검사' 버튼을 눌러 아이디를 입력해주세요." readonly /> <input
                            type="button" name="dbCheckID" id="check_button" value="ID 중복 검사"
                            onclick="idCheck()" />
                    </div>
                    </p>
                    <div id="idError" class="error"></div>
                </div>


                <div class="input_style">
                    별명&nbsp;<span style="color: red">*</span>

                    <div class="btn-input">
                        <input class="input_body" size=50 maxlength="20" type="text"
                            name="nickname" id="nickname"
                            placeholder="'별명 중복 검사' 버튼을 눌러 아이디를 입력해주세요."
                            onClick="select_area()" readonly /> <input type="button"
                            id="check_button" value="별명 중복 검사" onclick="nicknameCheck()">
                    </div>
                    </p>
                    <div id="nicknameError" class="error"></div>
                </div>


                <div class="input_style">
                    비밀번호&nbsp;<span style="color: red">*</span>
                    <p style="color: gray">
                        8~15글자 이내 영문, 숫자, 특수문자 조합으로 입력해주세요.<br>[사용 가능한 특수문자 : ! @ # $
                        % ^ & + = ]
                    </p>
                    <input class="input_body" size=50 maxlength="16" type="password"
                        name="user_passwd" id="pwd"
                        placeholder="비밀번호(8~16자의 영문, 숫자, 특수기호)" />
                    <div id="pwdError" class="error"></div>
                </div>

                <div class="input_style">
                    비밀번호 확인&nbsp;<span style="color: red">*</span> <input
                        class="input_body" size=50 maxlength="16" type="password"
                        name="password_check" id="pwdChk" placeholder="비밀번호 확인" />
                    <div id="pwdChkError" class="error"></div>
                </div>

                <div class="input_style">
                    이메일 <input class="input_body" size=50 maxlength="25" type="email"
                        name="e-mail" id="email" placeholder="이메일은 선택사항입니다." />
                    <div id="emailError" class="error"></div>
                </div>

                <div class="input_style">
                    휴대전화&nbsp;<span style="color: red">*</span> <input
                        class="input_body" size=50 maxlength="13" type="text"
                        name="phone_num" id="phone_num" placeholder="번호는 숫자만 입력해주세요."
                        oninput="autoHyphen(this)" />
                    <div id="phoneNumError" class="error"></div>
                </div>
                <script>
            const autoHyphen = (target) => {
                target.value = target.value
                  .replace(/[^0-9]/g, '')
                 .replace(/^(\d{0,3})(\d{0,4})(\d{0,4})$/g, "$1-$2-$3").replace(/(\-{1,2})$/g, "");
               }
            </script>
            </div>
            </tr>
            </table>
            <button type="submit" class="next_btn" id="login" style="width: 100%">가입하기</button>
        </form>



        <script
            src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"
            integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p"
            crossorigin="anonymous">

      </script>
    </section>
</body>
<%@ include file="./HeaderFooter/Footer.jsp"%>
</html>


<script>
   // 가입부분 체크 
     var width = '450';
    var height = '360';
     var left = Math.ceil(( window.screen.width - width )*1.7);
    var top = Math.ceil(( window.screen.height - height )/2); 

   var openWin;
   function idCheck() {
      window.open("IdCheckForm.jsp", "idwin",
              'width='+ width +', height='+ height +', left=' + left + ', top='+ top+" resizable = no, scrollbars = no");
      window.name = "parentForm";
   }

   function nicknameCheck() {
      window.open("NicknameCheckForm.jsp", "idwin",
              'width='+ width +', height='+ height +', left=' + left + ', top='+ top+" resizable = no, scrollbars = no");
      window.name = "parentForm";
   }
</script>

<script src="../Page/badWordFilter.js"></script>